问题描述
我做了个多线程的服务器程序线程中等待客户端的消息部分代码如下:booleandone=clientRequest.isConnected();//判断客户端Socket是否连接while(done)//客户端是连接的{try{input=clientRequest.getInputStream();Binput=newBufferedInputStream(input);str=""+Binput.read();if(Binput.read()!=-1)//如果客户端有消息就打印出来{System.out.println(str);}}catch(IOExceptione){e.printStackTrace();}if(clientRequest.isclosed())//判断Socket是否关闭{done=false;//如果关闭,就跳出无限循环(while)}}我的代码能实现服务器与客户端的通信问题是:当客户端中断或退出以上代码却不能判断Socket中断跳不出while的无限循环请哪位大侠指点一二小弟不慎感激......
解决方案
解决方案二:
catch(IOExceptione){e.printStackTrace();}在这里改成catch(Exceptione){break;}试试
解决方案三:
还是不行当客户端断了后服务器站cup100%
解决方案四:
客户端发送关闭消息告诉服务器客户端要关了,关闭消息自己定义,比如发送个close字符串,表示客户端要关闭连接,服务器解析到这个字符串,就跳出循环,结束连接。
解决方案五:
我做的是跟一给网络设备进行通信它会发固定长度的数据而且它的模块是该不了的不能设定它发来的是什么数据所以楼上的方法行不通啊
解决方案六:
顶顶顶
解决方案七:
isConnect()方法啊
解决方案八:
设置timeout时间
解决方案九:
如果不行的话,可以用heartbeat来保活连接如果得不到心跳包就是连接丢失了......
解决方案十:
路过
解决方案十一:
以上方法都是没用的!try{socket.sendUrgentData(0);}catch(IOExceptione){//如果抛出了异常,那么就是断开连接了}
解决方案十二:
抛异常或者从客户端的输入流里读出的是null,这时就说明客户端已经断开.一般情况下,客户端断开都能读到一个null.
解决方案十三:
try{socket.sendUrgentData(0);}catch(IOExceptione){//如果抛出了异常,那么就是断开连接了}就是所谓的心跳测试,但是在本人实践中,发现它并不总是凑效。有时候明明测试过了,但是就是发不出数据,也读不到,最终timeout.
解决方案十四:
设置延迟断开,这需要拥有监控线程。曾经很多人利用这种特性攻击过HTTP服务器,后来用延迟断开解决这个问题的。
解决方案十五:
if(Binput.read()!=-1)//如果客户端有消息就打印出来这句返回0和-1类似意思不一样,你试试看。
解决方案:
跟帖拿分
解决方案:
引用11楼inhibitory的回复:
从客户端的输入流里读出的是null,这时就说明客户端已经断开.
+try{socket.sendUrgentData(0);}catch(IOExceptione){//如果抛出了异常,那么就是断开连接了}
解决方案:
谢谢各位大侠的回复我搞定了总结一下:1.while(Binput.read()!=-1)这种方法能判断出客户端输入是否为空客户端断开能跳出死循环但是我想得到的数据却从第二个开始了所以这方法不适宜2.用下面的方法就没问题了在死循环中加入以下代码try{socket.sendUrgentData(0);}catch(IOExceptione){done=false;//如果抛出了异常,那么就是断开连接了跳出无限循环}10楼16楼说的没错12楼说的情况我暂时没有遇到谢谢散分...
解决方案:
貌似还是有问题啊就是开始用teinet命令去连接我的服务器然后关闭dos命令窗口代码能跳出无限循环但是我去关闭我的设备时就没什反应我再次连上设备后Java出错信息是:java.net.SocketException:Connectionreset麻烦给点意见
解决方案:
楼主,你18楼出现情况是正常的,如果要解决该问题,请确认:1.当关闭网络设备后,是否有什么消息会发给你的服务端程序?从你以上描述看,应该是断就断了,没有反应了。2.是否先要启动你的服务端程序,再启动那个网络设备?如果先启动网络设备,再启动你服务器会有什么结果?
解决方案:
19楼1.对网络设备在断开时是不会发送消息给服务器的2.无论先启动设备还是先启动我的服务器都能正常连接也能正常收到设备的数据问题是:当设备断开时我却不知道如何判断它断开了?
解决方案:
catch(Exceptione){System.out.println("客户机:"+socket.get忘记了+"离开了");return;}
解决方案:
while(true){try{in.read();}catch(Exceptione){in.close();socket.close();break;}}我都这样写,没遇到什么问题!
解决方案:
引用20楼hehebw的回复:
19楼1.对网络设备在断开时是不会发送消息给服务器的 2.无论先启动设备还是先启动我的服务器都能正常连接也能正常收到设备的数据 问题是:当设备断开时我却不知道如何判断它断开了?
如果是这样的话,你就不要判断那个网络设备断来了,因为当网络设备断开时候是没有消息发送给服务器的,而此时服务器正等待网络设备发送。当网络设备第二次连接上来时候,服务器就会抛异常,原因是已经不是第一次的网络连接了,所以你需要做的,当收到上面那个异常后,就重新启动一个新的socket(由于我问的第二点,无论先启动哪个都能正常连接,所以这样做是可以的)
解决方案:
进了循环体以后如果断了,isConnected判断就判不出来了,只能下次开始循环的时候检查,还是拿报错来判断的好。代码没细看。还有什么问题再问吧。
解决方案:
23楼没有别的办法了吗?重新开个Socket那是不是要重新开线程啊?那我怎么跳回到线程的开始呢?24楼问题是捕获不到断开时的报错啊
解决方案:
捕获的应该是流获取不到的错。运行的时候最长的时间应该是阻塞在从流里获取数据的地方,断开的时候程序一般也都停在这里,监听这里就行了,我自己做过这样的东西,就是这么处理的,isConnected基本没用。
解决方案:
很简单,加一个读取Buffer的函数read,这是个阻塞函数,用cSocket.setSoTimeout(2000)来设定其超时时间,抛出错误,判断其返回值,如果返回值不大于0,则表示客户端已经断开。
解决方案:
用那个什么Is什么的都没有用的!
解决方案:
read读到-1时,客户端就关掉了