Java Socket 如何判断客户端断开

问题描述

我做了个多线程的服务器程序线程中等待客户端的消息部分代码如下: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时,客户端就关掉了

时间: 2024-09-20 04:21:59

Java Socket 如何判断客户端断开的相关文章

Java socket 服务和客户端传值

packagesockerk; importjava.io.DataInputStream; importjava.io.IOException; importjava.net.Socket; importjava.net.UnknownHostException; publicclassSocketClient{ publicstaticvoidmain(String[]args){ Socketsocket=null; try{ socket=newSocket("127.0.0.1&quo

java Socket实现简单在线聊天(一)

最近的项目有一个在线网页交流的需求,由于很久以前做过的demo已经忘记的差不多了,因此便重新学习一下. 我计划的大致实现步骤分这样几大步: 1.使用awt组件和socket实现简单的单客户端向服务端持续发送消息: 2.结合线程,实现多客户端连接服务端发送消息: 3.实现服务端转发客户端消息至所有客户端,同时在客户端显示: 4.把awt组件生成的窗口界面改成前端jsp或者html展示的界面,java socket实现的客户端改为前端技术实现. 这里首先实现第一步的简单功能,难点在于: 1.没有用过

基于Java Socket实现一个简易在线聊天功能(一)_java

先给大家说下实现步骤分这样几大步: 1.使用awt组件和socket实现简单的单客户端向服务端持续发送消息: 2.结合线程,实现多客户端连接服务端发送消息: 3.实现服务端转发客户端消息至所有客户端,同时在客户端显示: 4.把awt组件生成的窗口界面改成前端jsp或者html展示的界面,java socket实现的客户端改为前端技术实现. 这里首先实现第一步的简单功能,难点在于: 1.没有用过awt组件,没有用过java相关的监听事件: 2.长时间没有使用socket进行客户端和服务端的交互,并

线程-使用Java socket让客户端与服务器建立连接后,服务器如何判断来自客户端的各类请求

问题描述 使用Java socket让客户端与服务器建立连接后,服务器如何判断来自客户端的各类请求 初学java,目前写了一个服务端和一个客户端.大致了解了如何socket通信是如何操作的,并且初步实现了客户端和服务端的通信.也仅仅是是接受和返回简单的字符串.部分代码如下 public void run(){ try{ serverSocket=new ServerSocket(SERVER_PORT_ONE); System.out.println("serversocket已创建"

socket判断对方断开连接

问题描述 我通过socket连接servlet,在servlet用了socket2.sendUrgentData(0xFF);判断客户端是否断开,在电脑手机模拟器上运行,连接的IP是localhost没问题,但把IP改成公网IP,servlet就出现问题了,报错如下:java.net.SocketException:Softwarecausedconnectionabort:sendatjava.net.PlainSocketImpl.socketSendUrgentData(NativeMet

利用java socket 写的一个联机的五子棋游戏,服务器端和客户端的问题,大神求教啊。。

问题描述 利用java socket 写的一个联机的五子棋游戏,服务器端和客户端的问题,大神求教啊.. 利用java socket 写的一个联机的五子棋游戏,一个服务器端的程序和两个玩家的客户端程序,可不可以都运行在同一台主机上啊? 我运行服务器端和其中一个玩家的客户端程序时,正常.但是运行第二个玩家的客户端程序时,就出现了 Java.net.BindExecption Address already in use: JVM_Blind. 的异常.怎么办? 还有我打算客户端把下的棋子的对象传给服

安卓 java socket ip-手机安卓客户端和电脑服务器进行socket通信,为什么socket不通?

问题描述 手机安卓客户端和电脑服务器进行socket通信,为什么socket不通? 手机安卓客户端和电脑服务器进行socket通信,程序都是java写的,客户端socket函数填的是电脑的外网ip(百度搜出来那个),手机用的是3g信号,但是socket不通..是ip填错了吗? 解决方案 楼主 我不会 你要是实现了 可以和我交流一下么?

java socket 通信 服务端接收的文件大于客户端发出的文件 是什么鬼

问题描述 java socket 通信 服务端接收的文件大于客户端发出的文件 是什么鬼 //服务端package Socket; import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.DataInputStream;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;

scoket tcp ip 报文-Java 的 Socket服务端客户端以tcp/ip协议发送接收报文

问题描述 Java 的 Socket服务端客户端以tcp/ip协议发送接收报文 代码谁有模板,比如给你一个login报文,logout报文!!急急急!!! 解决方案 Android Socket 编程(WIFI 和 ADB) 有了发送数据的功能,再发送文件还需要分包等协议. 解决方案二: 这个不知道是不是你要的答案, 解决方案三: http://blog.csdn.net/u013301192/article/details/46336719 解决方案四: 网页上的1楼回复应该对你有用,祝你好运