gpt4 book ai didi

python - 将 _socketobjects 作为参数传递

转载 作者:太空宇宙 更新时间:2023-11-03 11:56:19 24 4
gpt4 key购买 nike

我正在编写一个多线程分布式网络算法。

我有一个监听新连接的线程。每次建立新连接时,都会启动一个单独的线程来监听来自该连接的消息。

我的问题是我打开的套接字在连接监听器中的两个方向上都可以正常工作。在我将该连接的套接字对象传递给消息监听器后,我可以从套接字读取数据,但通过它发送数据不会到达远程主机。

这是我的代码的基本片段:

def connection_listener(port, start_e, terminate_e):

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.settimeout(1)
s.bind(('', port))

s.listen(1)

while (not start_e.isSet()):
try:
conn, addr = s.accept()

msg_in = conn.recv(1024).split(":")
if (msg_in[1]=="hello"):
# If addr sends us a 'id:hello', we reply with a 'my_id:welcome'
conn.send(str(my_id)+":welcome")

t = Thread(target=message_listener, args=(conn, addr[0], terminate_e, ))
t.start()
except:
pass # timeout


def message_listener(conn, address, terminate_e):

while (not terminate_e.isSet()):
try:
msg_in = conn.recv(1024)

# Here I can receive everything that I send from the other end of conn,
# but conn.send("any data") doesn't reach the remote host

我想做的是使用 conn 从消息监听器线程发送类似确认的消息。这是可能的还是我的想法和做错了?

最佳答案

我自己解决了这个问题,所以我会分享我的答案。

我通过用零填充到所需长度使协议(protocol)交换固定大小的消息。我使用了 32 字节的长度,从硬件的角度来看这可能非常小。尽管如此,它似乎按预期工作。

实际上我的解决方案是这样的:

def send_everyone(message):
for i in range(len(peers)):
chunk = (str(my_id)+":"+message).rjust(32, '0')
peers[i].send(chunk)

在接收端,我们一次只需要 32 个字节:

def message_listener(conn, address, terminate_e):
while (not terminate_e.isSet()):
try:
msg_in = conn.recv(32)

...

关于python - 将 _socketobjects 作为参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9056074/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com