javascript - socket.io socket.on('connect'...不允许同一页面获取多个套接字

标签 javascript socket.io

我有一个测试装置,试图在同一客户端和后端服务器之间创建两个套接字。启用调试后,我可以看到两个不同套接字(AAAA和AAAB)的xhr打开GET请求,相应的套接字接收到类型为“ open”的消息,并且数据的sid回显了套接字ID(AAAA或AAAB)。我在下面的跟踪中突出显示了这些内容。但是,它们都在调用socket.on(“ connect ...”函数之前发生,因此socket.io.engine.id仅反映第二个套接字的请求,并且该方法似乎被调用了两次。如果我猜,查找是在两个连接中都使用了以/结尾的URI,并正在读取后者(好像无法区分两个未完成的调用)。我正在维护执行io.connect的对象中显示的channelName,所以我可以跟踪哪个套接字被回调。

我希望跟踪的这一部分可以显示发生了什么-我还没有找到管理订阅的地方来了解它如何查找所有的侦听器... io.connect调用(一个用于NatA,一个用于NatB) )使用相同的URI和端口,并且都使用forceNew设置为true:

            console.log(this.channelName+": Connecting to " + uri);
            this.socket = io.connect(uri,{'channelName': initEvent.channelName, 'forceNew': true});
            this.socket.on("connect", function() {
                console.log(self.channelName+": Setting SocketID:"+self.socket.io.engine.id);


因此,在下面的日志中,您可以看到调用io.connect的NatA和NatB标签,以及调用on(“ connect”的侦听器的位置,但仅调用了第二个NatB套接字,并且被调用了两次。 ..


  NatA:连接到http://localhost:3001


socket.io-client:url解析http://localhost:3001 + 0ms

socket.io-client忽略套接字缓存http://localhost:3001 + 0ms

socket.io-client:管理员readyState关闭+ 0ms

socket.io-client:经理打开http://localhost:3001 + 1ms

engine.io-client:套接字创建传输“轮询” + 0ms

engine.io-client:轮询轮询+ 1ms

engine.io-client:轮询xhr xhr轮询+1毫秒

engine.io-client:polling-xhr xhr打开GET:http://localhost:3001/socket.io/?EIO=3&transport=polling&t=1443463452620-0 + 1ms

engine.io-client:轮询xhr xhr数据null + 1ms

engine.io-client:套接字设置传输轮询+ 1ms

socket.io-client:manager连接尝试将在20000 + 6ms之后超时

socket.io-client:经理readyState打开+ 1ms

NatB:连接到http://localhost:3001

socket.io-client:url解析http://localhost:3001 + 10ms

socket.io-client忽略套接字缓存http://localhost:3001 + 9ms

socket.io-client:经理readyState关闭+ 2ms

socket.io-client:经理打开http://localhost:3001 + 1ms

engine.io-client:套接字创建传输“轮询” + 5ms

engine.io-client:轮询轮询+ 1ms

engine.io-client:轮询xhr xhr轮询+1毫秒

engine.io-client:polling-xhr xhr打开GET:http://localhost:3001/socket.io/?EIO=3&transport=polling&t=1443463452629-1 + 1ms

engine.io-client:轮询xhr xhr数据null + 0ms

engine.io-client:套接字设置传输轮询+ 1ms

socket.io-client:manager连接尝试将在20000 + 6ms之后超时

socket.io-client:经理readyState打开+ 0ms

engine.io-client:轮询轮询获得数据ArrayBuffer + 8ms

engine.io-client:socket套接字接收:键入“ open”,数据“ {” sid”:“ As6yk_kvlPxYGYdBAAAA”,“ upgrades”:[“ websocket”],“ pingInterval”:25000,“ pingTimeout”:60000}” + 4毫秒

engine.io-client:套接字套接字打开+ 1ms

socket.io-client:管理员打开+ 12ms

socket.io-client:套接字传输已打开-连接+ 0ms

engine.io-client:套接字开始升级探针+1毫秒

engine.io-client:套接字探测传输“ websocket” + 0ms

engine.io-client:socket创建传输“ websocket” + 0ms

engine.io-client:轮询轮询+ 1ms

engine.io-client:轮询xhr xhr轮询+ 0ms

engine.io-client:轮询xhr xhr打开GET:http://localhost:3001/socket.io/?EIO=3&transport=polling&t=1443463452647-2&sid= As6yk_kvlPxYGYdBAAAA + 1ms

engine.io-client:轮询xhr xhr数据null + 0ms

engine.io-client:轮询轮询获得了数据ArrayBuffer + 4ms

engine.io-client:套接字套接字接收:键入“打开”,数据“ {” sid”:“ QRjctK24vsx9-rJzAAAB”,“升级”:[“ websocket”],“ pingInterval”:25000,“ pingTimeout”:60000} +1毫秒

engine.io-client:套接字套接字打开+ 0ms

socket.io-client:管理员打开+ 9ms

socket.io-client:套接字传输已打开-连接+ 8ms

engine.io-client:套接字开始升级探针+1毫秒

engine.io-client:套接字探测传输“ websocket” + 0ms

engine.io-client:socket创建传输“ websocket” + 1ms

engine.io-client:轮询+ 0ms

engine.io-client:轮询xhr xhr轮询+ 0ms

engine.io-client:轮询xhr xhr打开GET:http://localhost:3001/socket.io/?EIO=3&transport=polling&t=1443463452655-3&sid= QRjctK24vsx9-rJzAAAB + 1ms

engine.io-client:轮询xhr xhr数据null + 0ms

engine.io-client:套接字探针传输“ websocket”已打开+ 1ms

engine.io-client:套接字探测传输“ websocket” pong + 12ms

engine.io-client:套接字暂停当前传输“轮询” + 0ms

engine.io-client:正在轮询我们当前正在轮询-等待暂停+ 1ms

engine.io-client:套接字探针传输“ websocket”已打开+ 0ms

engine.io-client:套接字探测传输“ websocket” pong + 3ms

engine.io-client:套接字暂停当前传输“轮询” + 1ms

engine.io-client:正在轮询我们当前正在轮询-等待暂停+ 0ms

engine.io-client:轮询轮询获得了数据ArrayBuffer + 7ms

engine.io-client:套接字套接字接收:键入“消息”,数据“ 0” + 1ms

socket.io解析器将0解码为%j + 0ms对象{type:0,nsp:“ /”}

NatB:设置SocketID:QRjctK24vsx9-rJzAAAB

全局:发布ChannelInitialized:{“ channelName”:“ NatB”}

engine.io-client:轮询预暂停轮询完成+ 3ms

engine.io-client:轮询暂停+ 1ms

engine.io-client:套接字更改传输并发送升级包+ 0ms

engine.io-client:套接字设置传输websocket + 1ms

engine.io-client:套接字清除现有的传输轮询+ 0ms

engine.io-client:轮询忽略轮询-传输状态“已暂停” + 0ms

engine.io-client:轮询轮询获得了数据ArrayBuffer + 1ms

engine.io-client:套接字套接字接收:键入“消息”,数据“ 0” + 0ms

socket.io分析器将0解码为%j + 7ms对象{type:0,nsp:“ /”}

NatB:设置SocketID:QRjctK24vsx9-rJzAAAB

最佳答案

我没有在发布的代码中看到如何打开两个套接字,但是如果每个套接字都在同一个JavaScript对象中打开,并且您将两个套接字映射到this.socket,则第一个套接字将被内存覆盖第二。

关于javascript - socket.io socket.on('connect'...不允许同一页面获取多个套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32831232/

相关文章:

javascript - 在递归 ng-repeat 中保持同级元素的计数

javascript - 重用简单的 Javascript 函数

javascript - 带有 websocket 和 cloudflare 的 Node.js 无法工作

javascript - 为什么 mozilla firefox 会记录来自 socket.io 1.2.1 的许多消息

php - mysql 推送通知到node.js

javascript - Angular JS 错误状态未显示

javascript - 如何防止数组在for循环中更新?

javascript - 选择除一个元素及其子元素/孙元素之外的所有元素

node.js - 将 jwt 暴露给客户端可能会导致安全问题

node.js - openshift 与 socket.io,npm install 无法读取依赖项