Node JS - 你如何判断一个套接字是不是已经使用 Einaros WS 套接字模块打开?

Posted

技术标签:

【中文标题】Node JS - 你如何判断一个套接字是不是已经使用 Einaros WS 套接字模块打开?【英文标题】:Node JS - How Can You Tell If A Socket Is Already Open With The Einaros WS Socket Module?Node JS - 你如何判断一个套接字是否已经使用 Einaros WS 套接字模块打开? 【发布时间】:2014-12-02 18:28:54 【问题描述】:

我目前正在使用 einaros 的 NodeJS WS 模块来创建 websocket 客户端。 初始化套接字客户端时,我使用 'open' 事件来确定连接何时打开,但是一旦打开,我如何检查它是否仍然打开?

“WebSocket”对象上是否有可以用来快速检查套接字状态的属性?

是否 - websocketInstance.readyState - 是否足够?

【问题讨论】:

if (socket.readyState === 1) 然后系统认为套接字仍然打开。您可以获得的唯一更好的保证是发送消息并等待响应。 如果你想知道readyState何时变为close,你也可以监控onclose事件。 @jfriend00 有时是onclose is never fired @TheSexiestManinJamaica - 阅读下面我回答的最后一段。 【参考方案1】:

socket.readyState 会告诉你套接字认为它的状态是什么。没有其他比socket.readyState 更准确的属性可供您参考。

如果您想知道套接字何时完成连接并且现在被认为是打开的,那么您可以为open 事件注册一个事件处理程序。这将告诉您何时完成连接。

如果您希望在套接字关闭或遇到错误时获得实时通知,您可以使用事件侦听器来处理 errorclose 事件。 close 事件仅表示套接字正在关闭,socket.readyState 值现在变为已关闭。

一种更能保证是最新的检查套接字的方法是首先检查socket.readyState,如果这表明套接字是打开的,那么你可以发送一个测试数据包到另一端,并且只有当你从测试数据包中得到响应,您是否真正知道套接字是可操作的。

socket.io 库(建立在 webSockets 之上)正是这样做的,它发送定期保持活动的数据包并侦听响应。如果它在一段时间内没有响应,那么它将关闭现有的套接字并尝试重新建立一个新的连接(认为先前的连接以某种方式丢失了)。通过这种方式,socket.io 库甚至可以在服务器重新启动或客户端 Internet 连接暂时中断的情况下幸存下来,因为它会看到连接丢失,然后透明地在其位置重新建立新连接。

【讨论】:

这对我来说有点太抽象了。如果您能给我看一些实际的 nodejs 代码,我将不胜感激。因此,假设我想查看 localhost 端口 5858 上是否有侦听器。我将如何编写一个函数,如果存在则返回 true,否则返回 false?谢谢。 @rocky - 这与这里提出的问题不同。我建议您自己提出一个新问题,询问您的具体情况。您可以在评论中链接此处的新问题,我会在您发布后查看。【参考方案2】:

我认为您应该注意错误并断开回调。这样你就会在它关闭时收到通知。

【讨论】:

以上是关于Node JS - 你如何判断一个套接字是不是已经使用 Einaros WS 套接字模块打开?的主要内容,如果未能解决你的问题,请参考以下文章

如何判断套接字是不是已断开连接(Java)[重复]

Node.js 如何响应升级请求?

如何在 node.js 中监听随机 tcp 套接字

如何防止 Node.js 将套接字消息拆分成更小的块

在 node.js 中,如何创建一个自动绑定到可用端口的 UDP 套接字?

使用 Node.Js 和 Promises,你如何返回一个已经实现的 Promise? [复制]