将_socketobjects作为参数传递

时间:2012-01-29 19:30:42

标签: python multithreading network-programming

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

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

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

以下是我的代码中的基本剪辑:

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从消息监听器线程发送类似确认的消息。这可能是某种方式,还是我在思考并做错了?

1 个答案:

答案 0 :(得分:1)

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

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

            ...