我计划使用 zmq 在个人笔记本电脑和远程计算机之间进行通信。我计划使用笔记本电脑作为服务器,使用远程计算机作为客户端。目前,我使用 VPN 进入远程计算机的网络并使用 ssh 访问该计算机。
我试图使用 zmq 文档上的一些教程代码来查看发送的消息是否已收到,但这不起作用。
服务器代码:
#
# Hello World server in Python
# Binds REP socket to tcp://*:5555
# Expects b"Hello" from client, replies with b"World"
#
import time
import zmq
context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind("tcp://*:5555")
while True:
# Wait for next request from client
message = socket.recv()
print("Received request: %s" % message)
# Do some 'work'
time.sleep(1)
# Send reply back to client
socket.send(b"World")
客户端代码:
#
# Hello World client in Python
# Connects REQ socket to tcp://localhost:5555
# Sends "Hello" to server, expects "World" back
#
import zmq
context = zmq.Context()
# Socket to talk to server
print("Connecting to hello world server…")
socket = context.socket(zmq.REQ)
socket.connect("tcp://ip_addr_of_laptop:5555")
# Do 10 requests, waiting each time for a response
for request in range(10):
print("Sending request %s …" % request)
socket.send(b"Hello")
# Get the reply.
message = socket.recv()
print("Received reply %s [ %s ]" % (request, message))
我尝试研究 ssh 隧道,但对于如何为我的用例设置它感到困惑。
你所希望的叫做 远程转发。 (VPN 似乎对您没有帮助; 也许它选择防火墙/阻止入站连接请求。)
从笔记本电脑连接到远程计算机。 测试5555端口是否能得到服务—— 我们预计答案是“否”。
lap$ ssh the_remote_machine
rem$ telnet localhost 5555
Trying 127.0.0.1...
telnet: connect to address 127.0.0.1: Connection refused
telnet: Unable to connect to remote host
(您可能会看到提到的 IPv6 地址
::1
;忽略它即可。)
现在重新连接并启用转发。
rem$ exit
lap$ ssh -R 5555:localhost:5555 the_remote_machine
rem$ telnet localhost 5555
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
太棒了! 现在你的Python客户端代码可以连接到
tcp://localhost:5555
,
远程的 sshd 会将数据发送回笔记本电脑的 ssh,
它将代表您连接到笔记本电脑 zmq 服务器。
想象一个不相关的 zmq 守护进程已经在远程服务器上运行, 所以你需要选择一个不同的端口。 你可以这样做。
lap$ ssh -R 5556:localhost:5555 the_remote_machine
rem$ telnet localhost 5556
Trying 127.0.0.1...
Connected to localhost.
笔记本电脑上的 zmq 服务器对这些恶作剧一无所知, 并愉快地坚持使用通常的端口 5555。