当前位置:编程学习 > JAVA >>

linux下如何判断socket是否有效

建立一个长连接,如果服务端关闭,那么客户端如何知道该连接不可用?
查找到判断socket长连接是否有效的办法是socket.sendUrgentData,如果不抛出异常就是有效;
可是测试发现在window下是可以捕获到异常的;但是在linux下无法捕获异常;
后来发现连续发两次socket.sendUrgentData,如果第二次与第一次间隔时间稍长的话,第二次异常可以捕获,可是这样就影响效率了?谁有更好的办法?
下面是测试代码:
        Socket socket = new Socket();
        socket.connect(new InetSocketAddress(ip, port));
        LOG.info("--wait--");
        LOG.info("--do--");
        socket.sendUrgentData(0xff);
        socket.sendUrgentData(0xff);
        socket.close();
        LOG.info("--over--"); --------------------编程问答-------------------- tcp连接本身就是有状态的...何必要依靠发送数据来确定...
第一,不管服务器还是客户端断开连接,另一端必定会收到socket连接断开的异常
第二,在socket发送数据前,可以检查 socket.isConnected() 来判断连接是否存在
第三,假设服务器没有开启,connect动作就不应该会执行下去,直接就抛错了 --------------------编程问答--------------------
引用 1 楼  的回复:
tcp连接本身就是有状态的...何必要依靠发送数据来确定...
第一,不管服务器还是客户端断开连接,另一端必定会收到socket连接断开的异常
第二,在socket发送数据前,可以检查 socket.isConnected() 来判断连接是否存在
第三,假设服务器没有开启,connect动作就不应该会执行下去,直接就抛错了



长连接是需要定期发送心跳包检测的 --------------------编程问答--------------------
引用 2 楼  的回复:
引用 1 楼 的回复:

tcp连接本身就是有状态的...何必要依靠发送数据来确定...
第一,不管服务器还是客户端断开连接,另一端必定会收到socket连接断开的异常
第二,在socket发送数据前,可以检查 socket.isConnected() 来判断连接是否存在
第三,假设服务器没有开启,connect动作就不应该会执行下去,直接就抛错了



长连接是需要定期发送心跳……

心跳包的作用是保持长连接存在吧
LZ要的是判断连接状态,应该是isConnected() 和 isClosed()吧 --------------------编程问答-------------------- isConnected() 和 isClosed()都是判断本地端的状态的,如果建立连接后服务器端关闭服务,此时isConnected()是true , isClosed()是false,无法判断服务器端的服务已不可用,我是想知道该连接已不可用 --------------------编程问答-------------------- 服务器端操作系统是window时,会有异常,但是服务器端是linux时,没有异常,还可以正常发送心跳包
引用 1 楼  的回复:
tcp连接本身就是有状态的...何必要依靠发送数据来确定...
第一,不管服务器还是客户端断开连接,另一端必定会收到socket连接断开的异常
第二,在socket发送数据前,可以检查 socket.isConnected() 来判断连接是否存在
第三,假设服务器没有开启,connect动作就不应该会执行下去,直接就抛错了
补充:Java ,  Java EE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,