首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

麻烦socket 来指点下 多谢了

2013-03-26 
麻烦socket 高手进来指点下 谢谢了 首先介绍下本人情况,一直是写PHP CODE, 最近公司需要JAVA编写多线程的s

麻烦socket 高手进来指点下 谢谢了
首先介绍下本人情况,一直是写PHP CODE, 最近公司需要JAVA编写多线程的server端,无奈只得去临时学了下,所以有些问题挺小白的,希望得到高人帮助

项目大概情况:本项目是由C++, PHP, JAVA 组成,其中C++,和PHP是作为CILENT, SERVER端是JAVA, C++是数据提供方, 由SERVER处理之后丢进数据库, PHP负责展示(有多个C++客户端,1个PHP客户端)
通信模型(图稍微画得有点简陋,意思大概是这样):

麻烦socket 来指点下 多谢了


问题:现在这个通信模型是没有问题,但是请求和响应并没有进行分离,在通信中出现了通过接口传比较大一点的文件(send方法每次只有传1024),会发生传送失败,经过DEBUG调试,发现是由于SOCKET在响应传送文件的请求的同时,如果有新的请求过来,那么依照这个模型,问题就出现了,数据是交替传输,导致C++或者PHP接受到的响应都是错误的


解决方案:准备把request和response单独写成安全线程,这个应该怎么去改呢,这个程序我也是拼拼凑凑写了大概2个星期,现在要改,我也不知道应该怎么去改 希望大家给点意见..谢谢了

[解决办法]
这个是否是你想要的?这种模式应该没问题,我项目中如果简单的都会用这种模式,比较适合客户端,服务端一般用nio来处理,但基本上也是类似的。


class Request implements Runnabek{
    OutputStream os;
    Queue<byte[]> queue;//用concurrent下面的类
    public void run(){
        while(true){
            // os().send(queue.pop());
        }
    }
    public synchronized void send(byte[] bs){
        queue.offer(bs);
    }
}

class Response implements Runnabek{
    IputStream is;
    byte[] cache = new byte[1024];
    public void run(){
        while(true){
            int len = is.read(cache);
            // handle(cache, 0, len);
        }
    }
}

new Thread(new Request(socket.getOutputStream())).start();
new Thread(new Response(socket.getInputStream())).start();

[解决办法]
_____________          ______________         _____________

[解决办法]
           
[解决办法]
          
[解决办法]
            
[解决办法]
 request 
[解决办法]
            
[解决办法]


------解决方案--------------------


           
[解决办法]
  to do   
[解决办法]
            
[解决办法]
 <------ 
[解决办法]
            
[解决办法]


[解决办法]
   处理    
[解决办法]
 <------  
[解决办法]
    连接    
[解决办法]
  wait   
[解决办法]
    客户    
[解决办法]


[解决办法]
   线程    
[解决办法]
          
[解决办法]
    线程    
[解决办法]
 ------> 
[解决办法]
    请求    
[解决办法]


[解决办法]
           
[解决办法]
          
[解决办法]
            
[解决办法]
   i'm   
[解决办法]
            
[解决办法]


[解决办法]
___________
[解决办法]
          
[解决办法]
____________
[解决办法]
  doing  
[解决办法]
____________
------解决方案--------------------



      
[解决办法]
_____________________________________________Y
                     response:result


上面的排版有点问题,这样看起来应该会好点
[解决办法]
楼主的问题就是同步和异步问题。传统的socket是阻塞模式(同步),就是请求等待响应,在此期间这个请求必须等待到服务器的响应,才可以发送下一条请求。
你可以去看看NIO异步socket通信
那个玩意肯定适合你这个架构
[解决办法]
引用:
引用:这个是否是你想要的?这种模式应该没问题,我项目中如果简单的都会用这种模式,比较适合客户端,服务端一般用nio来处理,但基本上也是类似的。
Java code?1234567891011121314151617181920212223242526class Request implements Runnabek{    Out……

怪怪的哈,其实就是写两个类,一个类负责发,一个负责收。
发送需要同步,调用send时,仅仅是把数据存储起来,不直接调用IO发送方法。类似生产者-消费者模式,这里仅有一个消费者,因此只需要在生产者调用的方法上加同步。
接收本身不需要同步,因为你程序肯定要杜绝一个以上线程阻塞读IO,即这个从设计上肯定要保证仅一个线程在操作io.read(),所以无需同步。

热点排行