3

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

4

2 回答 2

2

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

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

于 2010-09-28T21:28:59.403 回答
-1

“我需要一种将命令从服务器发送到客户端的方法。”

不要这样做。它颠倒了“客户端”和“服务器”的通常含义。客户端扮演主动角色并从服务器发送内容或请求内容。

Twisted(或更一般的任何事件驱动框架)能够解决这个问题吗?

它不应该。您正在颠倒客户端和服务器的角色。

如果服务器决定发送数据,它应该能够发送;

假的,其实。

服务器被限制为等待客户端请求数据。这通常是“客户端”和“服务器”的公认含义。


“一个向客户端发送命令,一个向服务器传输结果。这个解决方案听起来更像是标准的客户端-服务器通信吗?”

不。

如果客户端向服务器发送消息并从服务器接收响应,它将满足更常见的定义。

有时,这种事情被描述为具有“代理”,它们是——每个——一种服务器和一个“控制器”,它是所有这些服务器的单个客户端。

控制器将工作分派给代理。代理是服务器——它们监听一个端口,接受来自控制器的工作,然后工作。每个代理必须做两件并发的事情(通常通过selectAPI):

  • 监视一个众所周知的套接字,它将在该套接字上接收来自唯一客户端的工作。

  • 做这项工作(在后台)。

这就是客户端-服务器通常的意思。

如果每个代理都是服务器,您会发现很多库都支持这一点。这是每个人都这样做的方式。

于 2010-09-22T19:25:47.560 回答