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

2021-02-07 20:32:43 +08:00
 jchnxu

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

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 比数据库里多的情况

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

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

不过加上了之后,最后发现是有很多非 websocket 的 tcp 连接
jchnxu
2021-02-08 19:58:46 +08:00
@v2Mark 主要是服务端需要知道状态,所以我最后还是做了服务端 ping

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/752192

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX