node.js - Socket.io 'connection' 和 'disconnection' 事件可以为单个客户端触发多少次?
问题描述
编辑:我看到我在服务器上的处理程序中得到ping timeout
了transport error
原因。disconnect
这使得在我的服务器中维护状态变得困难(我试图跟踪哪些用户在类似聊天的设置中连接(。我正在阅读它可能与 Chrome 中的背景选项卡有关(我正在运行). 有没有人对这些“虚假”断开连接事件有任何经验?
我是 Socket.io 的新手,在理解连接和断开连接过程时遇到了一些麻烦。
据我了解,当客户端连接时,服务器会收到connection
一次事件,然后在回调中注册该客户端的所有处理程序on.('connection')
。真的吗?
我想维护一个已连接的用户,因此我将一个用户添加到connection
处理程序上的该数组中。
然后我应该监听disconnect
事件以知道何时从该数组中删除用户吗?我可以保证该事件只会被触发一次吗?
这有点令人困惑,因为在客户端,有一个connect
事件,显然可以多次触发 - 文档说
// note: you should register event handlers outside of connect,
// so they are not registered again on reconnection
这是与服务器端不同的范例,所有处理程序都在处理程序中注册connection
。但是,如果客户端connect
事件可以在重新连接时触发,那么该reconnect
事件是做什么用的?(文档说这个事件是“在成功重新连接时触发的。”)
一般来说,我对连接、断开和重新连接的过程以及这与事件的关系感到困惑,它是由于连接问题而“随机”发生还是仅在程序员的控制下发生,以及人们应该预期接收每个事件的次数这些事件中——一次只用于服务器,多次用于客户端?
谢谢你的帮助!
解决方案
我是 Socket.io 的新手,在理解连接和断开连接过程时遇到了一些麻烦。
欢迎来到 Node.js + Socket.io 的奇妙世界,超级强大!
据我了解,当客户端连接时,服务器会收到一次连接事件,并且在 on.('connection') 的回调中注册该客户端的所有处理程序。真的吗?
正确的。看一下我的代码示例:
服务器端
var clients = []; /* stores all sockets on the fly */
io.on('connection', function (socket) {
clients[socket.id] = socket; /* keeps an array of sockets currently connected */
socket.on('disconnect', function (data) {
console.log(socket.id + " disconnected");
delete clients[socket.id];
});
});
客户端
socket = io.connect(YOUR_SOCKET_URI, { transports: ['websocket'] } );
socket_delegates();
socket_delegates = function() {
// Socket events
socket.on('connect', function(data) {
/* handle on connect events */
});
socket.on('disconnect', function () {
/* handle disconnect events - possibly reconnect? */
});
socket.on('reconnect', function () {
/* handle reconnect events */
});
socket.on('reconnect_error', function () {
/* handle reconnect error events - possible retry? */
});
}
然后我应该监听断开事件以知道何时从该数组中删除用户吗?我可以保证该事件只会被触发一次吗?
是的。您将在上面的服务器代码中看到我们侦听disconnect
然后执行我们需要的操作。
没有什么是随机的。您应该有代码来处理服务器端的connect
,和处理,和客户端的代码。disconnect
connect
disconnect
reconnect
推荐阅读
- java - 如何从 Java 中的 /places/v1/autosuggest 获取 JSON 响应?
- jquery - 通过 jQuery AJAX 在 ASP.Net Core 中返回视图 - 在生产中不起作用
- c++ - C ++检查国际象棋游戏中是否有玩家在路上
- reactjs - 如何在反应中导航到新页面?
- java - Java:方法 org.postgresql.jdbc4.Jdbc4Connection.isValid(int) 尚未实现
- prolog - 试图在序言中打印出 preOrder Traversal
- html - 显示外部 SVG
- node.js - 如何使基于角色的中间件在nodejs和mongoose中以适当的权限访问api?
- java - 并行垃圾收集器是否在主程序旁边的单独线程上运行
- lua - 丰富的 Lua 智能感知