V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jchnxu
V2EX  ›  程序员

websocket tcp 连接太多了怎么查比较好

  •  
  •   jchnxu · 2021-02-07 20:32:43 +08:00 · 1337 次点击
    这是一个创建于 1396 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我大概是这样,想让服务端能检查客户端在线状态

    client:

    let interval;
    const connect = () => {
        sock = new WebSocket();
        // 连上了就取消不断重连
        clearInterval(interval);
    };
    
    sock.onclose = () => {
        // 断了就重连
        interval = setInterval(connect, 60000);
    };
    

    server:

    const wsServer = new WebSocket.Server({ server });
    
    wsServer.on("connection", async (conn, req) => { 
        
        const id = uuid.v4();
        
        // 存一个在线的客户端到数据库里
        onlineTable.addById(id);
        
        conn.on("close", () => {
        	// 掉线之后,把数据库里的条目删掉
            onlineTable.removeById(id);
        });
    });
    

    结果现在发现 ESTABLISHED tcp connection (netstat -tnulpao | grep port | awk '{print $6}' | sort | uniq -c) 远远多于数据库里已经有的条目,多一个数量级

    本地尝试了很多断网,压测之类的操作,还是没能出现 tcp connection 比数据库里多的情况

    我感到没有思路,各位老哥知道该怎么查不

    4 条回复    2021-02-08 19:58:46 +08:00
    uselessVisitor
        1
    uselessVisitor  
       2021-02-08 09:52:41 +08:00
    重连放在 onError 里面好一些吧。。
    服务端不懂 js,Java 做的话一般会存 session 在 Map 里。心跳检测,不在就 remove
    v2Mark
        2
    v2Mark  
       2021-02-08 11:05:33 +08:00
    客户端不会主动发送消息么? 还是说客户端断开了,服务器无法立马收到通知?
    jchnxu
        3
    jchnxu  
    OP
       2021-02-08 19:58:25 +08:00
    @beichenhpy 我感觉是的。没有做心跳

    不过加上了之后,最后发现是有很多非 websocket 的 tcp 连接
    jchnxu
        4
    jchnxu  
    OP
       2021-02-08 19:58:46 +08:00
    @v2Mark 主要是服务端需要知道状态,所以我最后还是做了服务端 ping
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1027 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 706ms · UTC 20:55 · PVG 04:55 · LAX 12:55 · JFK 15:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.