我正在编写一个带有多个套接字的程序,使用select语句来管理它们,使用以下代码:
while not self.stopped:
input_ready, output_ready, except_ready = select.select(self.input_sockets, [], [], 5)
if (not input_ready) and (not output_ready) and (not except_ready):
print("Timed Out")
else:
for s in input_ready:
s.process_data()
为此,我创建了一个从socket.socket
中抽象出来的类,并添加了方法process_data
。我有一个以这种方式定义的类,它绑定到套接字以侦听入站连接,当调用process_data()
时,它使用(sock, address) = self.accept()
接受连接...然后我添加sock
到用于select的input_sockets
数组,但显然accept方法返回一个套接字,而不是一个抽象类,因此没有process_data()
方法,因此会导致错误。
有人能想到一种方法,我可以使用accecpt()
方法返回我自己的抽象套接字类而不是普通的套接字吗?
由于
编辑:
我现在找到了一个快乐的工作 - 我没有创建一个抽象的套接字类,而是创建了一个标准类,如下所示:
class DirectConnection():
def __init__(self, sock):
self.socket = sock
def fileno(self):
return self.socket.fileno()
def process_data(self):
print("Got data")
然后从我的监听插座
(sock, address) = self.accept()
socketmanager.monitor_socket(DirectConnection(sock))
select.select
使用套接字对象的fileno属性,因此通过定义一个fileno()
方法返回传递给类的套接字的fileno()
,我现在可以拥有select.select
在这个类上调用我的方法,然后我可以指示从传入的套接字发送/接收数据。
赠送给:http://bytes.com/topic/python/answers/437702-subclassing-socket和http://code.activestate.com/recipes/52295/