我在端口 3000 上的 HTTP 服务器上运行一个 Web 应用程序。此应用程序连接到端口 9001 上的 Websocket 服务器。WS 和 HTTP 服务器都位于同一个 VM 内。
在本地(VM 内部)测试应用程序时,一切正常。Web 应用程序和 WS 服务器都可以相互通信。应用程序和服务器都监听本地主机上的连接,如下所示:
Web 应用程序 (ReactJS):const sock = new WebSocket('ws://localhost:9001/');
WS 服务器 (Python):ws = WebsocketServer(host='127.0.0.1', port=9001)
当将其设置为允许外部连接时,Web 应用程序和 WS 服务器将无法再通信。服务器仍会监听 上的连接host='127.0.0.1'
。Web 应用程序前端代码已更改为连接到运行 VM 的计算机(假设为123.45.67.890
):
Web 应用程序 (ReactJS):const sock = new WebSocket('ws://123.45.67.890:9001/');
我启用了端口 3000 和 9001 的端口转发,并从虚拟机内部禁用了两个端口上的防火墙。主机上两个端口均已打开。
我可以使用 从外部访问 Web 应用程序123.45.67.890:3000
,因此我非常确定与 VM 的连接已打开。但是,Web 应用程序无法与端口 9001 上的 WS 服务器通信。您知道这可能是什么原因造成的吗?
万一操作系统信息有帮助:
虚拟机主机:Microsoft Windows 7 Enterprise (6.1.7601 Service Pack 1 Build 7601)
虚拟机来宾:CentOS Linux release 7.4.1708 (Core)
答案1
这很容易修复,甚至在websocket 服务器我正在使用的。
只需按如下方式实例化 WS 服务器,ws = WebsocketServer(host='0.0.0.0', port=9001)
以便它监听所有传入连接。