【发布时间】:2010-09-22 19:00:38
【问题描述】:
我目前正在用 Python 编写一个项目,它有一个客户端和一个服务器部分。我的网络通信有问题,所以我需要解释一些事情......
客户端主要执行服务器告诉他的操作并将操作结果发送回服务器。我需要一种在 TCP 套接字上进行双向通信的方法。
现状
我目前在服务器端使用 Twisted 框架的 LineReceiver,在客户端使用纯 Python socket(和 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(或更一般的任何事件驱动框架)是否能够解决这个问题?我什至没有通信方面的真实事件。如果服务器决定发送数据,它应该能够发送;尽可能不需要在通信端等待任何事件。
【问题讨论】:
-
好问题,但您接受了一个未回答的问题。 :-( 我不在乎你是否称它为服务器/客户端/其他任何东西。- P2P 不是一个扭曲的东西?
标签: python network-programming twisted event-driven-design