首先介绍下本人情况,一直是写PHP CODE, 最近公司需要JAVA编写多线程的server端,无奈只得去临时学了下,所以有些问题挺小白的,希望得到高人帮助
项目大概情况:本项目是由C++, PHP, JAVA 组成,其中C++,和PHP是作为CILENT, SERVER端是JAVA, C++是数据提供方, 由SERVER处理之后丢进数据库, PHP负责展示(有多个C++客户端,1个PHP客户端)
通信模型(图稍微画得有点简陋,意思大概是这样):
问题:现在这个通信模型是没有问题,但是请求和响应并没有进行分离,在通信中出现了通过接口传比较大一点的文件(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
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------