我目前正在用 Python 编写一个项目,它有一个客户端和一个服务器部分。我的网络通信有问题,所以我需要解释一些事情......
客户端主要执行服务器告诉他的操作,并将操作结果发送回服务器。我需要一种在 TCP 套接字上进行双向通信的方法。
现在的情况
我目前LineReceiver
在服务器端使用 Twisted 框架,在客户端使用普通 Python socket
(and ssl
)(因为我无法正确实现 Twisted PushProducer
)。在客户端有一个Queue
填充了应该发送到服务器的数据;一个子进程不断地从队列中提取数据并将其发送到服务器(参见下面的代码)。
如果只有客户端将其结果推送给经理,则此方案运行良好。服务器不可能向客户端发送数据。更准确地说,客户端无法接收服务器发送的数据。
问题
我需要一种将命令从服务器发送到客户端的方法。
我考虑过在我用来从队列发送数据的客户端循环中监听传入数据:
def run(self):
while True:
data = self.queue.get()
logger.debug("Sending: %s", repr(data))
data = cPickle.dumps(data)
self.socket.write(data + "\r\n")
# Here would be a good place to listen on the socket
但是这个解决方案有几个问题:
- 该
SSLSocket.read()
方法是一种阻塞方法 - 如果队列中没有数据,客户端将永远不会收到任何数据
是的,我可以使用Queue.get_nowait()
代替Queue.get()
,但总而言之,我认为这不是一个好的解决方案。
问题
有没有使用 Twisted 实现这一要求的好方法?在 Twisted 上,我真的没有太多的技能可以在那里找到自己的路。我什至不知道LineReceiver
对这类问题使用 是否是一个好主意,因为如果它没有从客户端接收数据,它就无法发送任何数据。只有一个lineReceived
事件。
Twisted(或更一般的任何事件驱动框架)能够解决这个问题吗?我什至没有交流方面的真实事件。如果服务器决定发送数据,它应该能够发送;尽可能不需要在通信端等待任何事件。