使用套接字向客户端发送定期消息的最佳方法

时间:2013-02-23 23:43:50

标签: sockets

有一个应用程序需要向一堆客户端发送消息。客户是用户的应用程序'计算机,这些应用程序有时会一天运行几天。服务器有新的说明,或者它没有。有时在两条新指令之间有10分钟,有时是一小时,有时是一天。消息具有固定长度。

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

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

最后一个确实看起来相当复杂。做这个的最好方式是什么?来自服务器的新消息("指令")应在服务器"具有"之后至少15秒到达客户端。他们。

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

感谢您的时间。

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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