在搞遥控功能时候,发现一个奇怪的问题,socket的服务端传指令到客户端,我用了一个status来判断是否传送成功:

点击开始遥控,客户端收到start_manual_mode指令

java 检测socket断开 java socket服务器判断客户端断开_客户端


页面返回的也是true,说明成功发送

java 检测socket断开 java socket服务器判断客户端断开_java 关闭socket 线程池_02


此时关闭客户端,并且点击前进指令

java 检测socket断开 java socket服务器判断客户端断开_发送消息_03


发现仍然是true,发送成功,

java 检测socket断开 java socket服务器判断客户端断开_发送消息_04


再次点击前进指令,发现这次就是false了;

java 检测socket断开 java socket服务器判断客户端断开_java 关闭socket 线程池_05


按道理说,客户端关闭,再点击指令,应该马上就变为false,而不是第二次才变,这里我用debug走了好几次,发现第一次都是正常走流程,第二次被trycatch捕获异常,我自己猜测是客户端关闭,输入输出流还有效,可以正常发送(但是客户端已关闭),第二次则会捕获socket关闭异常,

在客户端发送消息的时候,可以判断socket是否有效:

try {
    socket.sendUrgentData(0);
     } catch (IOException e) {
         //如果抛出了异常,那么就是断开连接了
         return false;
     }

把上面代码加在服务端发送方法里,每次发送消息,就会判断socket是否有效

java 检测socket断开 java socket服务器判断客户端断开_发送消息_06


这样,只要客户端一关闭,发送消息,就会捕获到异常,不会存在之前延迟一步的情况