python中的多插槽:异步

时间:2017-09-08 14:46:45

标签: python sockets asynchronous

我想在服务器端使用2个套接字(带有不同的端口)(publisher0将异步数据流传输到单个客户端(用户)。每个套接字将从其中一个传感器流式传输数据:传感器的采样率虽然我找到了一些建议使用select的答案,但我找不到这个特殊情况的起始代码。下面是我到目前为止的代码。它不起作用:启动后这2个文件,代码在订阅者和发布者端都挂起,没有打印出来。

publisher.py

import socket
import select

sock1 = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
sock2 = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
sock1.bind( ('', 23000) )
sock2.bind( ('', 23001) )

sock1.listen( 1 )
sock2.listen( 1 )
clisock1, (remhost, remport) = sock1.accept()
clisock2, (remhost, remport) = sock2.accept()
clisocks = [clisock1, clisock2]
while 1:

    ready_socks,_,_ = select.select(clisocks, [], [])
    for sock in ready_socks:

        sock.send(b"Hello World\n")

clisock1.close()
clisock2.close()

subscriber.py

import socket
import select

sock1 = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
sock2 = socket.socket( socket.AF_INET, socket.SOCK_STREAM )

sock1.connect( ('', 23000) )
sock2.connect( ('', 23001) )

socks = [sock1, sock2]

while True:
    ready_socks,_,_ = select.select(socks, [], [])
    for sock in ready_socks:
        data, addr = sock.recvfrom(100) # This is will not block
        print("received message:", data)

我很茫然,我非常感谢一些建议。

1 个答案:

答案 0 :(得分:1)

您面临的问题是由于您将传输套接字放在错误的列表中。 select.select()有两个列表,一个接收列表和一个发送列表。因此,您需要更新行

    ready_socks,_,_ = select.select(socks, [], [])

publisher.py 中改为阅读

    _,ready_socks,_ = select.select([], socks, [])

其中传输套接字作为第二个参数输入,套接字就绪在第二个返回值中。如果你更新它,你的程序将工作。但是,它会快速发送大量消息,因为您的程序没有延迟。另外,如上所述,无法区分您的两个频道。我想这是因为你减少了你的例子。