【发布时间】:2016-10-26 14:53:57
【问题描述】:
我有一台 AWS 服务器(中型)在 EU West 运行,大约有 250 台设备已连接,但由于互联网连接问题也总是重新连接,但由于某种原因,与服务器的 TCP 连接量一直在增长,直到达到4300左右。然后不允许新的连接到服务器。我已经确认它与 WebSocket 请求隔离,而不是常规 HTTP 请求。
WebSocket 连接以设备 UUID 作为键在 Map 中按 device 保存;有时即使服务器与设备建立了连接,设备也会发送新的 WS 连接请求。在这种情况下,当前连接被关闭,并返回错误,以便设备可以重试连接请求。
以下是控制器中使用 LegacyWebSocket 处理连接的代码 sn-p。根据https://www.playframework.com/documentation/2.5.x/JavaWebSockets#handling-websockets-using-callbacks 使用out.close() 关闭连接
public LegacyWebSocket<String> create(String uuid) {
logger.debug("NEW WebSocket request from {}, creating new socket...", uuid);
if(webSocketMap.containsKey(uuid)){
logger.debug("WebSocket already exists for {}, closing existing connection", uuid);
webSocketMap.get(uuid).close();
logger.debug("Responding forbidden to force WS restart from device {}", uuid);
return WebSocket.reject(forbidden());
}
LegacyWebSocket<String> ws = WebSocket.whenReady((in, out) -> {
logger.debug("Adding downstream connection to webSocketMap-> {} webSocketMap.size() = {}",uuid, webSocketMap.size());
webSocketMap.put(uuid,out);
// For each event received on the socket,
in.onMessage(message->{
if(message.equals("ping")){
logger.debug("PING received from {} {}",uuid, message);
out.write("pong");
}
});
// When the socket is closed.
in.onClose(() -> {
logger.debug("onClose, removing for {}",uuid);
webSocketMap.remove(uuid);
});
});
return ws;
}
如何确保 Play Framework 关闭已关闭的 WS 连接的 TCP 连接?
我用来检查 TCP 连接数量的调用是netstat -n -t | wc -l
【问题讨论】:
标签: java tcp playframework websocket