我做了个多线程的服务器程序 线程中等待客户端的消息 部分代码如下:
boolean done=clientRequest.isConnected();//判断客户端Socket是否连接
while(done)//客户端是连接的
{
try
{
input = clientRequest.getInputStream();
Binput = new BufferedInputStream(input);
str = "" + Binput.read();
if(Binput.read()!= -1)//如果客户端有消息就打印出来
{
System.out.println(str);
} }
catch (IOException e)
{
e.printStackTrace();
}
if(clientRequest.isclosed())//判断Socket是否关闭
{
done=false;//如果关闭,就跳出无限循环(while)
}
} 我的代码能实现服务器与客户端的通信
问题是: 当客户端中断或退出 以上代码却不能判断Socket中断 跳不出while的无限循环
请哪位大侠指点一二 小弟不慎感激......
boolean done=clientRequest.isConnected();//判断客户端Socket是否连接
while(done)//客户端是连接的
{
try
{
input = clientRequest.getInputStream();
Binput = new BufferedInputStream(input);
str = "" + Binput.read();
if(Binput.read()!= -1)//如果客户端有消息就打印出来
{
System.out.println(str);
} }
catch (IOException e)
{
e.printStackTrace();
}
if(clientRequest.isclosed())//判断Socket是否关闭
{
done=false;//如果关闭,就跳出无限循环(while)
}
} 我的代码能实现服务器与客户端的通信
问题是: 当客户端中断或退出 以上代码却不能判断Socket中断 跳不出while的无限循环
请哪位大侠指点一二 小弟不慎感激......
{
e.printStackTrace();
} 在这里改成
catch (Exception e) {
break;
}
试试
关闭消息自己定义,比如发送个close字符串,表示客户端要关闭连接,服务器解析到这个字符串,就跳出循环,结束连接。
如果得不到心跳包就是连接丢失了......
try {
socket.sendUrgentData(0);
} catch (IOException e) {
//如果抛出了异常,那么就是断开连接了
}
一般情况下, 客户端断开都能读到一个null.
socket.sendUrgentData(0);
} catch (IOException e) {
//如果抛出了异常,那么就是断开连接了 }就是所谓的心跳测试,但是在本人实践中,发现它并不总是凑效。 有时候明明测试过了,但是就是发不出数据,也读不到,最终time out.
try {
socket.sendUrgentData(0);
} catch (IOException e) {
//如果抛出了异常,那么就是断开连接了 }
1. while(Binput.read()!= -1) 这种方法 能判断出客户端输入是否为空 客户端断开 能跳出死循环
但是 我想得到的数据却从第二个开始了 所以这方法不适宜2. 用下面的方法就没问题了 在死循环中加入以下代码
try {
socket.sendUrgentData(0);
} catch (IOException e) {
done= false; //如果抛出了异常,那么就是断开连接了 跳出无限循环
} 10楼 16楼说的没错 12楼说的情况我暂时没有遇到
谢谢 散分...
但是我去关闭我的设备时 就没什反应 我再次连上设备后 Java出错信息是:
java.net.SocketException: Connection reset
麻烦给点意见
System.out.println("客户机:"+socket.get忘记了+"离开了");
return;
}
try{
in.read();
}
catch(Exception e) {
in.close();
socket.close();
break;
}
}我都这样写,没遇到什么问题!
如果是这样的话,你就不要判断那个网络设备断来了,因为当网络设备断开时候是没有消息发送给服务器的,而此时服务器正等待网络设备发送。当网络设备第二次连接上来时候,服务器就会抛异常,原因是已经不是第一次的网络连接了,所以你需要做的,当收到上面那个异常后,就重新启动一个新的socket(由于我问的第二点,无论先启动哪个都能正常连接,所以这样做是可以的)