你可以看看http://www.csdn.net/expert/Topic/197/197530.shtm的贴子原理是这样的:读到长度0不能断定是已经断开.读到-1,才代表输入流已经被关闭,说明socket已经close,而且关键在于你怎么读,实际上应该是一个单独的线程一直在读,因为你无法预先知道能不能一次将发过来的包读完,也无法知道一次是不是读完整了包,所以线称一直循环在读并且一直在解包.这样即能知道什么时候server断,也完成了消息的解读,我的方案是这样的,在大数据量高速率网络上运行没有发生过丢包. 下面给出客户端的一段主要代码/
//线程运行主程序段
public void run(){
while (Action !=0){
try{
is = socket.getInputStream();
ir = new InputStreamReader(is);
AppServer.sysinfo.HNMState = "正常!!";
char str[] = new char[1024];
ir.read(str); //平时在这里等待,但是SERVER一断就立即会向下运行。
String Packet = new String(str);
if ( Packet.trim().length()>0) {
// AppServer.log.showmessage(Packet,0);
UnPack(Packet);
}
else{
Integer ee = new Integer(Packet.trim().length());
AppServer.sysinfo.HNMState = "断开!!";
break;
}
}catch (Exception err){
AppServer.log.showmessage("解包错误",0); //没有出现过EXCEPTION
}
} }
//线程运行主程序段
public void run(){
while (Action !=0){
try{
is = socket.getInputStream();
ir = new InputStreamReader(is);
AppServer.sysinfo.HNMState = "正常!!";
char str[] = new char[1024];
ir.read(str); //平时在这里等待,但是SERVER一断就立即会向下运行。
String Packet = new String(str);
if ( Packet.trim().length()>0) {
// AppServer.log.showmessage(Packet,0);
UnPack(Packet);
}
else{
Integer ee = new Integer(Packet.trim().length());
AppServer.sysinfo.HNMState = "断开!!";
break;
}
}catch (Exception err){
AppServer.log.showmessage("解包错误",0); //没有出现过EXCEPTION
}
} }
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货