异常如下:
java.net.SocketException: Socket is closed
at java.net.Socket.getOutputStream(Socket.java:916) ~[na
引起后果
服务端不知道客户端socket已经关闭,如果继续发送数据,可能导致发送如上关闭异常。如果有多个客户端长连接给服务端建立,异常处理不恰当的话,还可能引起下次发送异常关闭情况。
解决方案
socket客户端断开之后会回调服务端socket,这时服务端发现输入流的长度为 -1 这时首先需要关闭客户端socket,然后把该socket从发送列表中删除。
Java代码实例
- 检测是否断开
int len = in.read(head, 0, Const.PACK_HEAD_LEN);
// socket 已经断开,跳出循环
if (len == -1) {
break;
}
- 关闭客户端socket并且移除发送客户端socket
try {
socket.close();
sockets.remove(socket);
} catch (IOException e) {
this.logger.error(e);
} finally {
socket = null;
}