1如何判断socket是否连接;2如何结束socket.inputstream.read阻塞中的线程

1、如何判断当前的连接是否有效。
在客户端和服务器已经建立连接的情况下,如果连接断了(如服务器关闭,网线断了之类),客户端如何知道连接已断?
网上找到一个方法,使用sendUrgentData(0xFF); 如果服务器关闭就会抛出异常,在try里截获异常就可以判断
另外在客户端的接收语句in.readLine();中,如果服务器关闭也会抛出异常,截获异常就可以判断

但上面这两个方法都只能判断出服务器关闭时断线的情况,如果服务器把网络断开(关闭wifi或直接拔网线),上面两个方法都不会抛出异常,也就无法判断了,因为socket连接之后,服务端的状态就一直是连接状态,所以socket对应的方法都无法显示实时状态。

解决办法:使用ping命令

if(osName.contains("Windows")){
            //将要执行的ping命令,此命令是windows格式的命令
            pingCommand = "ping " + ipAddress + " -n " + pingTimes    + " -w " + timeOut;
        }else{
            //将要执行的ping命令,此命令是Linux格式的命令
            //-c:次数,-w:超时时间(单位/ms)  ping -c 10 -w 0.5 192.168.120.206
            pingCommand = "ping " + " -c " + String.valueOf(pingTimes) + " " + " -w " + String.valueOf(timeOut) + " " + ipAddress;
        }

2、如何结束掉正在阻塞中的线程

socket通讯时,客户端要开一个线程来接收数据,在线程中程序运行到in.readLine();时会阻塞,以等待数据的到来。但在这个状态下,Thread.interrupt()也无法结束掉这个线程。

带来的问题是,如果这个连接失效了,程序一直阻塞在in.readLine(),那么这个线程就成为了死线程,既不能使用,也不能结束。

解决办法:使用socket.setSoTimeout设置超时时间,到时间就抛异常超时

你可能感兴趣的:(Java)