【问题标题】:Differentiating Multiple Websockets区分多个 Websocket
【发布时间】:2017-05-16 21:51:54
【问题描述】:

我正在使用库(ShareDB)进行操作转换,服务器端和客户端使用websocket-json-stream进行通信。然而,这个 ShareDB 作为服务在 nodejs 上运行(我使用 zerorpc 来控制我的节点进程),因为我的主要 Web 框架是 Tornado(python)。我从thread 了解到,对于 TCP 等有状态协议,连接由客户端端口区分(因此只需要一个服务器端口)。而且根据这个response regarding how websockets handle multiple incoming requests,tcp和websockets的底层传输通道没有区别。

所以我的问题是,如果我创建一个从客户端到 python 服务器的 websocket,然后从客户端到我的 nodejs 代码(ShareDB 服务),服务器如何区分哪个套接字与哪个?服务器是否有责任在给定的时间只有一个套接字“监听”连接(即首先与 Python 服务器建立通信,然后开始监听第二个 websocket?)

【问题讨论】:

  • 我不太明白什么与什么相关联。您使用术语“服务器”和“客户端”没有足够的描述来表达您的意思。听起来你有两台服务器(一个 python 服务器和一个 nodejs 服务器)和一个客户端。因此,我假设客户端正在连接到您的两个独立服务器中的每一个。但是,然后你问服务器如何区分,但每个服务器应该只有一个到给定客户端的连接?对你想要做什么感到困惑。仅供参考,您通常会像识别带有 cookie 的传入 http 连接一样识别传入的 webSocket 连接。
  • 如果您从客户端连接到同一物理服务器计算机上的每个单独的服务器,那么您的每个服务器进程将在不同的端口上侦听,并且客户端将连接到适当的端口端口来识别它正在连接到哪个服务器。
  • 谢谢,我认为您对它的总结比我制定的要好,所以我将编辑措辞。两台服务器都在同一个物理系统上......我正在使用 Heroku,据我了解,它们只允许打开一个端口。
  • 您需要打开一个单独的传入端口(每个服务器一个),或者您需要使用代理,该代理可以将一个端口上的传入连接拆分为两个服务器进程的单独端口。可以通过多种方式配置代理。它可以使用 webSocket URL 或 DNS 主机名来了解给定连接的目标服务器进程。

标签: python node.js sockets websocket tornado


【解决方案1】:

在同一个物理服务器上运行两个服务器进程的最简单方法是让它们各自侦听不同的端口,然后客户端连接到该服务器上的相应端口,以指示它尝试连接到哪个服务器.

如果由于您的服务器环境而只能有一个传入端口,那么您可以使用代理之类的东西。您的两台服务器仍然在侦听不同的端口,但没有一台服务器正在侦听对外界开放的端口。代理侦听一个对外开放的传入端口,然后根据传入连接的某些特征,将该传入连接定向到相应的服务器进程。

可以配置代理以识别您尝试通过 URL 或 DNS 主机名连接的进程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    • 2018-02-16
    • 2020-05-31
    • 2018-07-28
    相关资源
    最近更新 更多