编辑:我看到我在服务器上的ipython
处理程序中得到ping timeout
和transport error
的原因。这使得很难维护服务器中的状态(我试图跟踪类似聊天设置中的哪些用户已连接(。我读到它可能与Chrome中的背景标签有关(我正在运行) )。是否有人对这些“虚假”断开事件有任何经验?
我是Socket.io的新手,在理解连接和断开过程时遇到一些麻烦。
据我所知,服务器在客户端连接时收到一次disconnect
事件,并且在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
事件的作用是什么? (文档说此事件是“重新连接成功后触发的。”)
通常,我对连接,断开连接和重新连接的过程以及它与事件的关系感到困惑,它是由于连接问题而“随机”发生还是仅在程序员的控制下发生,以及应该进行多少次?期望接收到这些事件中的每一个-仅针对服务器一次,针对客户端多次?
感谢您的帮助!
答案 0 :(得分:1)
我是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