【问题标题】:Computer refuses websocket connections计算机拒绝 websocket 连接
【发布时间】:2018-08-06 13:35:00
【问题描述】:

我目前正在测试一个非常基本的套接字示例,甚至基本测试都不起作用。我的 Python 代码(服务器)是:

import socket
server = socket.socket(socket.AF_INET)
server.bind(("0.0.0.0", 5000))
server.listen(1)
conn, addr = server.accept()

我的 Javascript 代码(客户端)是:

var connection = new WebSocket("wss://<my-local-ip>:5000");

但是,在启动我的 Python 代码并运行我的 Javascript 代码后,连接会在 WebSocket.CONNECTING 状态下挂起大约半分钟,然后才会出现错误:

WebSocket connection to 'wss://192.168.0.119:5000/' failed: WebSocket opening handshake timed out

我还尝试将&lt;my-local-ip&gt; 替换为我的公共 IP(根据 ipinfo.io/ip),但这给出了不同的错误:

WebSocket connection to 'wss://216.58.126.4:5000/' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED

我查看了互联网,所有示例的结构都与我的测试代码完全相同,为什么它不起作用?

【问题讨论】:

标签: javascript python websocket


【解决方案1】:

我不确定您问题的第一部分。但是,对于第二部分,您需要通过路由器配置端口转发。

如果您对此不熟悉,它基本上会告诉路由器向端口 X 发送任何请求到端口 Y 上的某个本地 IP(X 和 Y 通常相同)。当然,您需要一个静态本地 IP,否则您必须使路由器与计算机的动态 IP 保持同步。

有关端口转发的更多信息,请参阅 SuperUser 上的this post

【讨论】:

  • 仅端口转发并不总是足够的 - 从 LAN 内连接到公共 IP 将不会使用端口转发,除非路由器能够进行 NAT 环回(并且已启用该转发)规则)
  • @JaromandaX 我从来没有遇到过环回问题,当然我也没有为它配置任何东西。很可能取决于路由器。
  • 是的,端口转发解决了我的问题,谢谢!它还让我可以正确设置我最初尝试做的事情,所以是的。
【解决方案2】:

webSocket 连接不是普通的 TCP 连接。要接收传入的 webSocket 连接,您需要一个 webSocket 服务器,而不是普通的 TCP 服务器。

您需要一个支持 webSocket 连接协议(所有连接都以 HTTP 连接开始)、webSocket 安全交换和 webSocket 数据帧格式的服务器。

使用您拥有的普通 TCP 服务器,底层 TCP 套接字连接已建立,但在发送 webSocket 协议的第一阶段后,客户端正在等待您的服务器的第一个响应,而您没有发送它。等待一段时间后,客户端因为初始的 webSocket 握手失败而断开连接。

所以,在你的 python 中,你要么需要一个已经支持 webSocket 服务器的库,要么你需要自己实现完整的 webSocket 协议。

您可以在webSocket servers on MDN 的描述中看到 webSocket 连接的工作原理。

这也可能有用:What's the difference between WebSocket and plain socket communication?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    • 2017-06-09
    • 2013-07-06
    • 2018-06-06
    • 2019-02-26
    • 2018-12-05
    相关资源
    最近更新 更多