gpt4 book ai didi

python - Python网络编程的设计题

转载 作者:行者123 更新时间:2023-11-28 18:55:15 26 4
gpt4 key购买 nike

我目前正在用 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(或更一般的任何事件驱动框架)是否能够解决这个问题?我什至没有在通信方面的真实事件。如果服务器决定发送数据,它应该能够发送;通信端应该尽可能不需要等待任何事件。

最佳答案

“我什至不知道使用 LineReceiver 是否是解决此类问题的好主意,因为如果它不从客户端接收数据,它就无法发送任何数据。有只有一个 lineReceived 事件。”

您可以从任何地方使用 protocol.transport.write 发送数据,而不仅仅是在 lineReceived 中。

关于python - Python网络编程的设计题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3772719/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com