Socket.io客户端工作正常,直到服务器中断/重新启动。
服务器恢复后,它会重新连接,但是当发出事件时,我的所有客户端侦听器都不再触发。
网上似乎没有太多关于此的内容,但从我到目前为止所阅读的内容来看,这是我尝试过的:
在函数中包装我的所有.on侦听器,然后在每次客户端库重新连接/连接时调用该函数。
将我的所有io实例包装在一个函数中,每次调用它时都会返回它们的新实例。
跟踪服务器上的所有房间,然后重新连接后重新加入所有房间。
创建io实例时将'multiplex'设置为false。
这些都没有给我带来任何好运。
这是最相关的github问题,没有答案: https://github.com/socketio/socket.io/issues/1633
因为我的客户端上有所有房间名称,所以我可以重新连接这些房间而不使用像Redis这样的东西?感谢。
更新 在尝试了许多不同的策略一天后,似乎为每个命名空间创建一个.on('connection',fn)侦听器将使客户端和服务器正确地重新连接
io.of('namespace').on('connection', function(){
console.log("namespace connected")
});
如果你没有这个,socket.io仍然可以工作和连接,但它不会重新连接工作的客户端监听器。
我认为这应该是库中更新的内容。
无论如何,关于我的特殊问题,我仍然有一个问题:
我需要能够处理动态命名空间
io.of('namespace-<id>').on('connection', function(){
console.log("namespace id: <id> connected")
});
如果我有通配符支持,例如
,这将是完美的io.of('namespace-*').on('connection', function(){
console.log("namespace id: <id> connected")
});
完全符合我的情况。我浏览过不同的图书馆,比如这个:
https://www.npmjs.com/package/socket.io-events
但它只支持事件的通配符和正则表达式,而不支持名称空间。
答案 0 :(得分:0)
我提出的解决方案的答案是使事件名称动态而不是命名空间。
所以而不是
io.of('namespace-<id>').on('myevent', function(){
console.log("namespace id: <id> connected")
});
我做
io.of('namespace').on('myevent-<id>', function(){
console.log("namespace id: <id> connected")
});
但是,我确实想说,我这样做的唯一原因是因为我正在构建我的应用程序。 我想在分离关注点(EG页面到页面)时使用命名空间,在分离行为时使用空间(对于查看相同数据的两个不同方的EG缓存通知)。
除非您有特别想要动态命名空间的具体原因,否则您应该使用房间,因为这是它们的设计目的。