【发布时间】:2021-01-28 01:27:40
【问题描述】:
我是 socket.io 和 next.JS 的新手。在将 socket.io 集成到 Next 后,我注意到连接代码触发了两次,使我的连接数翻了一番(我需要准确)。
我搜索了很多,但没有找到有效的解决方案,包括 socket.once('connect')。我通过创建 manual 连接事件并在启动时从客户端发出来解决此问题。只要没有人断开连接,我现在就可以看到准确的连接计数。
至于断开连接,我遇到了同样的问题,每个用户会触发两次断开连接,但我不知道在发生断开连接时如何在客户端手动发出。
关于如何从客户端发出手动断开连接的任何建议?
还是一种新方法?也许使用一个集合来保存客户端 ID 而不是增加一个 int?但是,重复收集计数可能对性能不利(每个用户将非常频繁地访问总计数,可能每秒一次)。
服务器代码:
const SERVER_STATE = {
totalConnections: 0
}
// socket.io server
io.on('connection', socket => {
socket.once('userConnectOnce', () => {
SERVER_STATE.totalConnections++;
socket.emit('message', `Welcome from server. There are a total of ${SERVER_STATE.totalConnections} connections.`);
socket.broadcast.emit('message', `New user joined. There are a total of ${SERVER_STATE.totalConnections} connections.`);
});
socket.once('disconnect', () => { // this fires more than once
SERVER_STATE.totalConnections--;
socket.broadcast.emit('message', `Other user disonnected. There are now ${SERVER_STATE.totalConnections} connections.`);
});
});
客户端代码:
const Index = () => {
const socket = useSocket('message', (data) => {
console.log(data);
});
socket.emit('userConnectOnce', 'client-initiated userConnectOnce');
return (
<></>
);
};
注意:useSocket() 是来自下一个示例 repo 的自定义钩子,用于将 socket.on() 包装在 useEffect() 中并返回套接字。我找不到链接,也不确定它是否相关,但这里有一些代码:
import { useEffect } from 'react';
import io from 'socket.io-client';
const socket = io();
export default function useSocket(eventName, cb) {
useEffect(() => {
socket.on(eventName, cb);
return function socketCleanup() {
socket.off(eventName, cb);
}
}, [eventName, cb]);
return socket;
}
【问题讨论】:
-
您是自己制作的
useSocket钩子还是使用socket.io 的useSocket钩子?可以发一下代码吗? -
它来自下一个示例存储库。我找不到链接,所以我在上面的代码中添加了。