套接字是不是在重新连接事件中重用?

Posted

技术标签:

【中文标题】套接字是不是在重新连接事件中重用?【英文标题】:Are sockets reused on reconnect event?套接字是否在重新连接事件中重用? 【发布时间】:2016-07-06 07:45:41 【问题描述】:

当用户连接到服务器时会创建一个套接字。

由于 interwebz 故障,连接中断。

客户端自动重新连接。

socket连接会和他第一次连接时一样吗?或者插座会是一个新的吗?

谢谢!

【问题讨论】:

这将是新的连接 【参考方案1】:

重新连接时会建立新连接。可以通过打印socket.id来检查。

在服务器上:

var io = require('socket.io)(server);
io.on('connection', function (socket) 
  console.log('socket id is ' + socket.id); 

Excerpt from socket.io documentation

该属性在套接字连接后存在,在套接字断开连接时删除,并在套接字重新连接时更新。

【讨论】:

【参考方案2】:

我还想在电子应用程序中重新连接后保留状态(例如,如果主机暂停然后恢复,socket.io 会断开连接)。

我还没有尝试过,但是下面的文章讨论了如何在重新连接之间重用套接字 ID。如果我有任何成功,我会更新: https://newbedev.com/reuse-socket-id-on-reconnect-socket-io-node-js

【讨论】:

这里发生了什么 - 我没有成功实现上述方法 - 尽管套接字 id 可以通过重新连接传递,但由于 socket.io 内部的原因,实际的套接字仍然以不同的 id 结束。此外,创建了一个新的套接字对象,这意味着不再附加套接字对象上的事件侦听器,因此使用 socket.io 似乎不可能实现真正透明的重新连接。 相反,我删除了 socket.io 客户端和服务器,并在服务器上使用带有 ws (github.com/websockets/ws) 的原始浏览器 websockets 编写了我自己的实现。我还使用了 RPC 机制,类似于通过消息后类型接口传递回调的机制。它产生更少的网络请求、更少的代码和 3rd 方模块,并且重新连接工作完美,并且可以完全透明,所以对于客户端来说,它看起来总是连接的。似乎透明地重新连接似乎是socket.io的一个问题,它必须工作,所以我不得不摆脱它。

以上是关于套接字是不是在重新连接事件中重用?的主要内容,如果未能解决你的问题,请参考以下文章

重用异步套接字:后续连接尝试失败

WSA UDP 套接字无法重用,因为它强制关闭连接

如何重用TCP套接字python

TimeOut 异常后是不是可以重用套接字?

浅谈长连接keepalive和套接字重用reuse对高并发的影响

使用 WinSock 客户端/服务器应用程序重用套接字