我想在服务器端使用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)
我很茫然,我非常感谢一些建议。
答案 0 :(得分:1)
您面临的问题是由于您将传输套接字放在错误的列表中。 select.select()
有两个列表,一个接收列表和一个发送列表。因此,您需要更新行
ready_socks,_,_ = select.select(socks, [], [])
在 publisher.py 中改为阅读
_,ready_socks,_ = select.select([], socks, [])
其中传输套接字作为第二个参数输入,套接字就绪在第二个返回值中。如果你更新它,你的程序将工作。但是,它会快速发送大量消息,因为您的程序没有延迟。另外,如上所述,无法区分您的两个频道。我想这是因为你减少了你的例子。