TL;博士
我使用启动服务器pynng
,然后来自 Python 标准库的客户端socket
将尝试向它发送消息。
问题是客户端可以发送消息,但服务器没有注意到它。因此,它不起作用。
我错过了什么吗?一些低级协议设置?一些终止字符?
我这样做的原因是我将构建一个pynng
用作服务器的 Python 脚本。然后一个非 Python 程序(我假设它具有基本 TCP 协议的知识)将尝试与这个 Python 服务器通信。因此,我正在使用恕我直言,我可以操作的最原始的套接字库,socket
标准库中的模块。
细节
我将在讨论时展示代码片段,但我将在最后展示完整的最小代码示例。
我正在尝试使用pynng
def server():
with pynng.Pair0(listen=f'tcp://{HOST:s}:{PORT:d}', recv_timeout=10000) as s:
print("Server running")
data = s.recv() # Blocks forever here
print(data)
然后,看起来像这样的客户端将尝试连接到它:
def client():
with socket.create_connection(address=(HOST, PORT), timeout=5) as s:
print("Client connected")
s.sendall(b'Hello world')
print("Client sent message")
我把它们放在一起使用threading
:
def main():
srv = threading.Thread(target=server)
cli = threading.Thread(target=client)
srv.start()
cli.start()
srv.join()
cli.join()
最低工作代码
总而言之,这是最低限度的工作代码:
import socket
import pynng
import threading
HOST = "127.0.0.1"
PORT = 65432
def main():
srv = threading.Thread(target=server)
cli = threading.Thread(target=client)
srv.start()
cli.start()
srv.join()
cli.join()
def server():
with pynng.Pair0(listen=f'tcp://{HOST:s}:{PORT:d}', recv_timeout=10000) as s:
print("Server running")
data = s.recv() # Blocks forever here
print("Message received")
print(data)
def client():
with socket.create_connection(address=(HOST, PORT), timeout=5) as s:
print("Client connected")
s.sendall(b'Hello world')
print("Client sent message")
if __name__ == "__main__":
main()
然后我在终端中运行它
$ python main.py
似乎server
无法发送recv
消息,recv
因此尝试在 10000 毫秒时超时。
Server running
Client connected
Client sent message
Exception in thread Thread-1:
Traceback (most recent call last):
File "/home/kmonisit/miniconda3/envs/engg/lib/python3.8/threading.py", line 932, in _bootstrap_inner
self.run()
File "/home/kmonisit/miniconda3/envs/engg/lib/python3.8/threading.py", line 870, in run
self._target(*self._args, **self._kwargs)
File "main.py", line 39, in server
data = s.recv() # Blocks forever here
File "/home/kmonisit/miniconda3/envs/engg/lib/python3.8/site-packages/pynng/nng.py", line 454, in recv
check_err(ret)
File "/home/kmonisit/miniconda3/envs/engg/lib/python3.8/site-packages/pynng/exceptions.py", line 201, in check_err
raise exc(string, err)
pynng.exceptions.Timeout: Timed out