0

有一个应用程序需要向一堆客户端发送消息。客户端是用户计算机上的应用程序,这些应用程序有时一次运行数天。服务器要么有新的指令,要么没有。有时两条新指令之间有 10 分钟的间隔,有时是一小时,有时是一天。消息是固定长度的。

实现这一点的最佳方法是什么?我应该让客户端每 10 秒轮询一次服务器吗?每次新客户端连接时我是否应该在服务器上创建一个新线程,并保持连接直到有新指令,然后将其发送给客户端并让客户端创建一个新连接?

还是我应该将消息推送给客户?我正在考虑如何做到这一点,我想出了这个:服务器服务器既是服务器又是客户端。当客户端握手时,它会将其地址提供给服务器。然后,服务器开始充当客户端(显然,还充当服务器以使其他客户端能够连接),并与客户端保持连接。客户端就像服务器一样,等待消息。

最后一个似乎相当复杂。做这个的最好方式是什么?来自服务器的新消息(“指令”)应该在服务器“拥有”它们之后至少 15 秒到达客户端。

顺便说一下,服务器应用程序将在 Windows 上运行。我不确定的客户,但让我们假设多平台。服务器和客户端应用程序都是用 Python 编写的。

谢谢你的时间。

4

1 回答 1

0

我会让每个客户端打开与服务器的连接,然后等待读取任何数据。只要有消息要发布,服务器就会写入所有连接的客户端。

具体来说,服务器应该socket(), bind(), listen(), 然后进入一个accept()循环。对于每一个接受的新客户端,它应该只将连接的套接字添加到活动客户端列表中,而不是读取或写入任何内容(除非可能是初始应用程序级握手或身份验证,如果适用的话;在这种情况下,它应该在单独的线程、分叉进程或非阻塞事件循环中执行握手或身份验证,以避免缓慢的客户端锁定其他正在进行的身份验证甚至接受循环。)

客户端应连接到服务器(并在适用时执行握手或身份验证),然后等待它为他们提供任何数据。客户端在套接字上等待的方式传统上是使用poll()or完成的select()。这些调用可以在单独的线程或进程中以阻塞方式完成;或以非阻塞方式,在主应用程序循环中或由循环计时器触发。

每当服务器有消息要发布时,它都会遍历已连接的客户端列表,write()对每个已连接的客户端执行一条消息。

然后,客户端将从其当前或下一个返回,poll()select()指示套接字具有可读数据,并且它们将继续处理read()该消息。

于 2013-02-24T00:03:51.460 回答