编写推送到客户端的服务器应用程序(TCP)

时间:2011-11-01 00:39:49

标签: c++ qt sockets client-server push

我正在编写客户端 - 服务器应用程序,其中一个要求是服务器,在收到其中一个客户端的更新后,能够将新数据推送到所有其他客户端。这是一个C ++(Qt)应用程序,旨在运行在Linux(客户端和服务器)上,但我更多地寻找关于它应该如何工作的高级概念性想法(尽管低级思想也很好)。 / p>

服务器:

它需要(在其他职责中)保持套接字打开侦听来自潜在 n 不同客户端的传入数据包,可能是在后台线程上(我在套接字代码方面写得不多)除了学校里的一些叮叮当当的例子)。从客户端获取此数据后,它会对其进行处理,然后将其吐出到所有客户端,对吗?

当然,我不确定它是如何实现的。我猜这意味着它必须与每个客户端(至少是活动客户端)保持持久连接,但我甚至不理解如何维护此连接(或这些连接的列表)。

那么,我该如何处理呢?

2 个答案:

答案 0 :(得分:4)

通常,当您拥有多个客户端时,有几种方法可以解决此问题。

首先,在TCP中,当客户端连接到您时,它们将被放入队列中,直到它们可以被服务为止。这是给定的,除了调用accept系统调用以接收新客户端之外,您无需执行任何操作。收到客户端后,您将获得一个用于读写的套接字。谁首先读/写完全取决于你的协议,但双方都需要知道协议(由你来定义)。

一旦你有了套接字,你可以做一些事情。在一个简单的例子中,您只需读取一些数据,处理它,写回套接字,关闭套接字,并为下一个客户端提供服务。不幸的是,这意味着您一次只能为一个客户端服务,因此无法进行“推送”更新。另一个策略是保留所有打开的套接字列表。任何“更新”只是遍历列表并写入每个套接字。这可能会出现问题,因为允许推送更新(如果客户端发送请求,谁会关注它?)

更高级的方法是为每个套接字分配一个线程。在这种情况下,每次创建套接字时,都会启动一个新线程,其目的是为一个客户端提供服务。这减少了延迟并利用了多个核心(如果可用),但编程起来要困难得多。此外,如果您有10,000个客户端连接,那么10,000个线程会变得太多。将更新推送到单个客户端(在此方案中)非常简单(线程只是写入其各自的套接字)。立即推送所有这些都有点棘手(需要一个线程事件或生产者/消费者队列,这两个都不是很有趣的实现)

当然,还有一百万种其他方法可以处理这种情况(每个客户端有一个进程,一个线程池,一个负载平衡代理,你可以命名它)。我只想说在一个答案中无法涵盖所有​​这些内容。我希望这能解答您的基本问题,如果您需要我澄清任何内容,请告诉我。这是一个非常大的主题。但是,如果我可以提出建议,处理多个客户端的轮子已经被重新发明了一百万次。有非常好的库,比原始套接字IO更高效,更方便程序员。我建议libevent,它将网络请求转换为事件驱动的范例(更像是GUI编程,这可能对你很好),并且非常有效。

答案 1 :(得分:1)

据我所知,我认为你需要保持一个无限循环,(至少在程序终止之前),它会回应客户的连接请求。最好将它们添加到某种数组中。使用事件查看何时将新客户端添加到该阵列,并等待其中一个客户端提供数据。然后你就可以做你必须处理的数据并将其吐回来。