加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 将_socketobjects作为参数传递

发布时间:2020-12-20 13:26:21 所属栏目:Python 来源:网络整理
导读:我正在编写一个多线程分布式网络算法. 我有一个线程可以监听新的连接.每次建立新连接时,都会启动一个单独的线程来侦听来自该连接的消息. 我的问题是我打开的套接字在连接监听器内的两个方向都完美地工作.将该连接的套接字对象传递给消息侦听器后,我可以从套
我正在编写一个多线程分布式网络算法.

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

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

这是我的代码中必不可少的片段:

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

解决方法

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

我通过用零填充直到所需的长度来使协议交换固定大小的消息.我使用了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,terminate_e):
    while (not terminate_e.isSet()):
        try:
            msg_in = conn.recv(32)

            ...

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读