我正在尝试在不同网络中的客户端和服务器之间设置 TCP 通信。 由于我没有公共服务器并且不想设置端口转发,因此可以选择使用 TCP 隧道服务,例如 pinggy。
我通过 SSH 会话使用 pinggy 到他们的服务器。使用以下命令创建隧道:
ssh -p 443 -o StrictHostKeyChecking=no -o ServerAliveInterval=30 -R0:localhost:5000 [email protected]
我设置了一个简单的
server.py
,如下所示:
import socket
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('127.0.0.1', 5000))
server.listen()
while True:
conn, addr = server.accept()
print(f"Connection attempt: {addr}")
和一个
client.py
:
import socket
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(("...a.free.pinggy.link", 33143))
客户端的 IP 和端口由隧道服务提供,该服务设置为将任何内容从其服务器转发到我的本地主机:5000
我首先在计算机上运行
server.py
,然后运行 client.py
。
客户端完成时没有错误,但服务器上从未检测到连接尝试。
每次尝试连接到 pinggy 隧道时,界面都会正确显示这一点并增加总连接数,因此该部分似乎设置正确。服务器似乎没有转发/接收信号。
将地址配置更改为完全在本地运行,无需通过 pinggy 进行隧道传输,因此代码本身似乎没有问题。
我尝试过使用ngrok(与pinggy非常相似,但不是通过ssh),它工作得很好。
我希望 pinggy 通过 ssh 运行不会成为问题,因为使用它将 TCP 连接转发到本地托管的 minecraft 服务器也可以。
本来以为是防火墙问题,所以暂时关闭了,无济于事。 如果 pinggy 成功将流量转发到我的世界服务器,为什么它不能与运行 python 套接字的服务器一起工作?
不清楚您是否在 Windows / Linux / Mac 中。但根据Pinggy FAQ,Windows ssh 客户端有时难以连接到“localhost”等域。所以建议在命令中使用IP地址。
ssh -p 443 -o StrictHostKeyChecking=no -o ServerAliveInterval=30 -R0:127.0.0.1:5000 [email protected]