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

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

  •  
  •   jchnxu · 348 天前 · 857 次点击
    这是一个创建于 348 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    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
    beichenhpy
        1
    beichenhpy  
       348 天前
    重连放在 onError 里面好一些吧。。
    服务端不懂 js,Java 做的话一般会存 session 在 Map 里。心跳检测,不在就 remove
    v2Mark
        2
    v2Mark  
       348 天前
    客户端不会主动发送消息么? 还是说客户端断开了,服务器无法立马收到通知?
    jchnxu
        3
    jchnxu  
    OP
       347 天前
    @beichenhpy 我感觉是的。没有做心跳

    不过加上了之后,最后发现是有很多非 websocket 的 tcp 连接
    jchnxu
        4
    jchnxu  
    OP
       347 天前
    @v2Mark 主要是服务端需要知道状态,所以我最后还是做了服务端 ping
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2681 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 09:09 · PVG 17:09 · LAX 01:09 · JFK 04:09
    ♥ Do have faith in what you're doing.