传递_socketobjects作为参数

问题描述:

我在写一个多线程的分布式网络算法。传递_socketobjects作为参数

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

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

下面是从我的代码基本剪断:

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的消息监听器线程发送确认类似消息。这是可能的,或者我在想,做错了吗?

我整理了一下自己,所以我会分享我的答案。

我通过填充0到所需的长度,使协议交换固定大小的消息。我使用了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) 

      ...