有一个应用程序需要向一堆客户端发送消息。客户是用户的应用程序'计算机,这些应用程序有时会一天运行几天。服务器有新的说明,或者它没有。有时在两条新指令之间有10分钟,有时是一小时,有时是一天。消息具有固定长度。
实现此目的的最佳方法是什么?我应该让客户每隔10秒轮询一次服务器吗?我应该在每次新客户端连接时在服务器上创建一个新线程,并保持连接,直到有新指令,然后将其发送到客户端并让客户端创建新连接?
或者我应该将消息推送给客户?我在考虑如何做到这一点,我想出了这个: 服务器服务器既是服务器又是客户端。当客户端握手时,它会将其地址提供给服务器。然后,服务器开始充当客户端(并且作为服务器以显示其他客户端连接),并保持与客户端的连接。客户端就像服务器一样,等待消息。
最后一个确实看起来相当复杂。做这个的最好方式是什么?来自服务器的新消息("指令")应在服务器"具有"之后至少15秒到达客户端。他们。
顺便说一句,服务器应用程序将在Windows上运行。在我不确定的客户中,让我们假设多平台。服务器和客户端应用程序都是用Python编写的。
感谢您的时间。
答案 0 :(得分:0)
我希望每个客户端都打开与服务器的连接,然后等待读取任何数据。只要有要发布的消息,服务器就会写入所有连接的客户端。
具体来说,服务器应该socket()
,bind()
,listen()
,然后输入accept()
循环。对于接受的每个新客户端,它应该只将连接的套接字添加到活动客户端列表中,而不会读取或写入任何内容(除了初始应用程序级别的握手或身份验证,如果适用;在这种情况下,它应该在单独的线程,分叉进程或非阻塞事件循环中执行握手或身份验证,以避免慢速客户端锁定其他正在进行的身份验证甚至接受循环。)
客户端应连接到服务器(并在适用时执行握手或身份验证),然后等待它们获取任何数据。客户端在套接字上等待的方式传统上使用poll()
或select()
完成。这些调用可以在一个单独的线程或进程中以阻塞方式完成;或者以非阻塞的方式,在主应用程序循环中或由循环计时器触发。
每当服务器有要发布的消息时,它都会遍历已连接客户端列表,对每个连接的客户端执行write()
消息。
然后,客户端将从当前或下一个poll()
或select()
返回,并指示套接字具有可读数据,并且将继续read()
该消息。