Play 2.5 WebSocket连接搭建

Posted

技术标签:

【中文标题】Play 2.5 WebSocket连接搭建【英文标题】:Play 2.5 WebSocket Connection Build 【发布时间】: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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

以上是关于Play 2.5 WebSocket连接搭建的主要内容,如果未能解决你的问题,请参考以下文章

使用 Play Framework 1.2.5 访问 Web 服务

Play 2.5应用程序(deadbolt?)变得反应迟钝

Play 2.4 WebSocket在使用编译时依赖注入时抛出InstantiationException

WebSocket搭建 (node.js、c#作为服务器)

Scala Play 2.5 与 Slick 3 和 Spec2

Play Framework 无法连接到 WS