0

我阅读了很多关于 nodejs 的内容,但仍然不清楚以下内容:

  • 使用 TCP 协议客户端和服务器在一个端口上达成一致,然后可以保持连接。服务器知道客户端的 IP 地址,因此可以发回消息。如果我们使用 nodejs,那么多个客户端可以连接到同一个端口上的同一个 nodejs 服务器。这怎么可能?同一服务器如何在同一端口上建立多个连接。
  • 如果客户端在 NAT 之后,那么它的 IP 可以是动态的,那么 nodejs 服务器如何向客户端发送数据。
  • 在服务器和客户端上维护持久连接的资源利用率是多少?
  • nodejs服务器崩溃时发生了什么?客户端如何再次发起连接?
  • 如果客户端出现网络问题,并且每 5 分钟后终止并启动连接..那么有没有办法处理这种情况?
4

2 回答 2

4

使用 TCP 协议,客户端和服务器在一个端口上达成一致,然后可以保持连接。服务器知道客户端的 IP 地址,因此可以发回消息。如果我们使用 nodejs,那么多个客户端可以在同一个端口上连接到同一个 nodejs 服务器。这怎么可能?同一服务器如何在同一端口上建立多个连接。

单个端口上可以维护的连接数量没有限制(尽管实际上可能存在操作系统或硬件限制)。当然,只有单个进程可以监听端口,但这与连接无关。这不是特定于节点的,所有 TCP 服务器都是这样工作的。

如果客户端在 NAT 之后,那么它的 IP 可以是动态的,那么 nodejs 服务器如何向客户端发送数据。

你本质上是在问 NAT 是如何工作的。同样,在这种情况下没有特定于节点的内容。NAT 服务器根据需要简单地更改数据包标头,并维护路由转换表,就像任何连接一样。

在服务器和客户端上维护持久连接的资源利用率是多少

仅连接本身的开销确实非常小。一点点记忆,但在大局中几乎微不足道。如果您为每个连接存储额外的关联数据,则可能会有所不同。Node.js 可以很好地处理大量并发连接,但是如果您担心,您可以随时搜索基准测试,或者自己编写。

nodejs服务器崩溃时发生了什么?客户端如何再次发起连接?

套接字会发出关闭错误事件。只需收听它们,然后尝试重新连接,可能会有一个回退延迟。

如果客户端出现网络问题,并且每 5 分钟后终止并启动连接..那么有没有办法处理这种情况?

不完全确定你在这里问什么。客户端只需按照上一个问题/答案中的说明重新连接即可。如果您将某些数据与客户端套接字相关联,并且您希望在释放该数据之前客户端有机会重新连接的宽限期,那么您需要设置一个超时,该超时将在一定数量后释放这些资源的时间。然后,在连接侦听器中,或者可能在身份验证事件中,您需要分析新连接以查看它是否与最近断开连接的客户端匹配。

我肯定会推荐查看socket.io,特别是如果您的用例是基于 Web 的,尽管它不仅可以用于浏览器/服务器连接。它会或多或少地自动完成许多您似乎关心的事情(重新连接、资源关联、断开连接宽限期等)。

于 2013-06-04T13:56:58.887 回答
0

TCP 连接保持持续打开。保存是通过客户端不必以长池的方式从服务器连续刷新来实现的,以便检查服务器上是否有任何新消息,就像在 AJAX 的情况下一样。每隔几秒钟创建一个新连接以供客户端从服务器刷新,这对服务器、代理和路由器来说是很重的。如果 Node.js 连接保持打开状态,但在客户端或服务器有东西要发送之前它是不活动的。在这里找到好文章http://www.html5rocks.com/en/tutorials/websockets/basics/

想象一下,有 1000 个聊天客户端,每个客户端每 3 秒询问一次服务器是否有新消息到达。这导致服务器上每分钟有 2000 个请求和响应。在 Node.js 的情况下,只有当有消息要发送时,服务器才会向客户端发送消息,同时所有 1000 个连接都将处于空闲状态,但会保持打开状态。

TCP 连接始终在同一个端口(如端口 80)上启动,但在每个连接打开时分配给每个连接的不同端口上保持通信。因此,您仍然需要保持连接持续打开,但您不必像以前需要的那样持续发送池消息。

于 2015-10-20T13:13:48.943 回答