websocket客户端关闭后 服务端在onClose之前报错java.io.EOFException 完整解决方案
时间: 2023-10-30 15:12:26 浏览: 200
socket.io客户端及服务端
出现 `java.io.EOFException` 异常的原因是客户端主动关闭了连接,但服务端还在尝试向客户端发送数据,导致无法写入数据而抛出异常。
为了避免这种情况,可以在客户端关闭连接时,先通知服务端,然后等待服务端响应并正常关闭连接。具体实现可以在客户端关闭连接时,发送一个特定的消息给服务端,服务端收到该消息后,立即向客户端发送一个确认消息,并关闭连接。
以下是一个示例代码:
客户端代码:
```java
// 发送关闭连接消息
session.close(new CloseReason(CloseCodes.NORMAL_CLOSURE, "Client closed connection"));
```
服务端代码:
```java
@OnClose
public void onClose(Session session) {
// 关闭连接
try {
session.close();
} catch (IOException e) {
// 异常处理
}
}
@OnMessage
public void onMessage(Session session, String message) {
if ("close".equals(message)) {
// 发送确认消息并关闭连接
try {
session.getBasicRemote().sendText("closed");
session.close();
} catch (IOException e) {
// 异常处理
}
} else {
// 处理其他消息
}
}
```
在客户端关闭连接前,先发送一个消息 "close" 给服务端,服务端收到该消息后,立即向客户端发送一个确认消息 "closed",然后再关闭连接。这样就可以避免出现 `java.io.EOFException` 异常了。
阅读全文