目前我的客户端上有两个网络接口。我创建了两个独立的套接字,它们绑定到每个接口ip。现在我还有两台服务器,每台服务器与客户端上的一个套接字通信。我希望能够同时从两个接口(目前使用UDP或DGRAMS)接收数据(现在大约10MB但稍后会更大),但由于某种原因,总是有一个延迟,它必须用一个完成数据传输套接字开始在另一个套接字上传输。
我已经确认绑定每个接口都是成功的,并且我能够在每个套接字上与其各自的服务器进行通信。目前,我只需在同一代码块中执行s1.recv()
和s2.recv()
。
所以我的问题是,是因为"阻塞"使用recv()
的功能?通过我的搜索似乎有办法使功能解锁?但我不确定如何去做...这会通过使用多线程来解决吗?我对多线程有点生疏,但如果它解决了我的问题,我会调查它。如果没有那么我怎样才能利用这两个接口,因为我能够从两个接口并行接收/发送?
如果有人可以提供帮助,我会非常感激。
答案 0 :(得分:1)
recv
功能默认为阻止。这意味着该方法将暂停控制流,直到在此套接字上收到某些内容。如果您拨打sock1.recv()
然后再拨sock2.recv()
,则仅在套接字1收到内容时才会拨打第二个电话。
您可以使用setblocking
方法使recv
无阻塞,导致它立即返回,即使没有任何内容可以接收。但是,您可能必须轮询两个套接字以读取新字节:
s1.setblocking(False)
s2.setblocking(False)
while True:
# In non-blocking mode, recv throws a socket.error when
# there is nothing to receive.
try: a = s1.recv()
except socket.error: a = None
try: b = s2.recv()
except socket.error: b = None
handle_data(a,b) # Use received bytes at your discretion
您可以使用multiprocessing
或threading
模块并行调整两个recv
来电:
class SocketThread(threading.Thread):
def run():
while True:
a = self.sock.recv() # This time, recv in blocking mode
handle_data(a)
t1, t2 = SocketThread(), SocketThread()
t1.sock = sock1
t1.start()
t2.sock = sock2
t2.start()