如何判断socket客户端连接断开

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何判断socket客户端连接断开相关的知识,希望对你有一定的参考价值。

参考技术A 你可以根据服务器收到的数据的长度来判断,如果服务器收到的数据长度是0,那么意味着你的客户端程序已经断开了连接。从tcp/ip协议栈的角度来说,就是客户端程序关闭了自己写的这一半连接,向服务器发出了一个fin。这涉及到tcp的状态迁移,关于这方面的知识,建议你看一下richard
stevens先生的《tcp/ip
详解》卷一和《unix网络编程》卷一,上面有详细的解释。
关于你的第二个问题,建议你仔细看一下自己的服务器程序代码。服务器程序首先要建立一个监听socket,当有客户端连接上来时,服务器会在一个新socket上接受客户端连接。所以并不存在“乱”的问题。关于这个问题同样推荐你看上面的两本关于网络编程的经典著作。

Java 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的无限循环

 

解决方法:

1.  while(Binput.read()!= -1)  这种方法 能判断出客户端输入是否为空  客户端断开 能跳出死循环
                                   
2. 用下面的方法就没问题了  在死循环中加入以下代码 
try { 
socket.sendUrgentData(0); 
} catch (IOException e) { 
     done= false;    //如果抛出了异常,那么就是断开连接了  跳出无限循环

以上是关于如何判断socket客户端连接断开的主要内容,如果未能解决你的问题,请参考以下文章

如何判断客户端是不是如何判断是不是与服务器断开了

C# TcpListener如何知道客户端已经断开连接

TCP socket如何判断连接断开

TCP socket如何判断连接断开

socket 用disconnect 断开,再重新连接怎么搞

C语言关于socket中如何判断客户端是不是与服务器保持连接