播放2.5 WebSocket连接构建

时间:2016-10-26 14:53:58

标签: java tcp playframework websocket

我在EU West运行AWS服务器(中等),并且大约有250台设备已连接但由于互联网连接问题也一直在重新连接,但由于某种原因,与服务器的TCP连接数量增加,直到它达到4300左右。然后,不允许新的连接到服务器。我已经确认它与WebSocket请求隔离,而不是常规的HTTP请求。

在设备UUID作为密钥的Map中,设备保持WebSocket连接;有时候,即使服务器与设备有连接,设备也会发送新WS连接请求。在这种情况下,当前连接将关闭,并返回错误,以便设备可以重试连接请求。

以下是Controller使用LegacyWebSocket处理连接的代码片段。根据{{​​3}}

,使用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

1 个答案:

答案 0 :(得分:0)

看起来像TCP保持活动问题 - 即TCP连接因客户端连接问题而变得陈旧,并且服务器在达到限制之前没有及时处理或清理过时的连接。

This link将帮助您在服务器上配置TCP keep-alive,以确保及时清理过时的连接。