我正在尝试编写一个简单的 TCP 服务器,它必须按顺序执行以下操作:
- 客户端连接到服务器,并且
KEEPALIVE
此连接的标志设置为 1。 - 服务器从客户端接收数据。
- 然后它计算作为列表的响应。
- 然后服务器将列表中的每一项逐一发送,同时等待来自客户端的显式 ACK,即,在发送列表中的单个项目之后,服务器等待来自客户端的 ACK 数据包,并且只有在收到 ACK 之后它是否继续以相同的方式发送其余项目。
以下是代码:
class MyFactory(ServerFactory):
protocol = MyProtocol
def __init__(self, service):
self.service = service
class MyProtocol(Protocol):
def connectionMade(self):
try:
self.transport.setTcpKeepAlive(1)
except AttributeError:
pass
self.deferred = Deferred()
self.deferred.addCallback(self.factory.service.compute_response)
self.deferred.addCallback(self.send_response)
def dataReceived(self, data):
self.fire(data)
def fire(self, data):
if self.deferred is not None:
d, self.deferred = self.deferred, None
d.callback(data)
def send_response(self, data):
for item in data:
d = Deferred()
d.addCallback(self.transport.write)
d.addCallback(self.wait_for_ack)
d.callback(item)
return
def wait_for_ack(self, dummy):
try:
self.transport.socket.recv(1024)
except socket.error as e:
print e
return
在运行服务器和客户端时,我得到以下异常:
Resource temporarily unavailable
我了解此异常的原因 - 我正在尝试在非阻塞套接字上调用阻塞方法。
请帮助我找到解决此问题的方法。