【发布时间】: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