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

标签 c++ qt sockets client-server push

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

服务器:

它需要(除其他职责外)保持套接字打开以监听来自可能 n 个不同客户端的传入数据包,大概是在后台线程上(我没有写太多关于套接字的代码除了学校里一些流氓丁克的例子)。从客户端获取此数据后,它会对其进行处理,然后将其吐出给所有客户端,对吗?

当然,我不确定它实际上是如何做到这一点的。我猜这意味着它必须与每个客户端(至少是事件客户端)保持持久连接,但我什至在概念上不理解如何维护此连接(或这些连接的列表)。

那么,我该如何处理呢?

最佳答案

一般来说,当您有多个客户端时,有几种方法可以处理这个问题。

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

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

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

当然,还有上百万种其他方法来处理此问题(每个客户端一个进程、一个线程池、一个负载平衡代理,应有尽有)。可以说没有办法在一个答案中涵盖所有这些就够了。我希望这能回答您的基本问题,如果您需要我澄清任何问题,请告诉我。这是一个很大的课题。但是,如果我可以提出建议,处理多个客户是一个已经被重新发明了一百万次的轮子。那里有非常好的库,它们比原始套接字 IO 更高效且对程序员更友好。我建议 libevent ,它将网络请求转变为事件驱动的范例(更像是 GUI 编程,这可能对您来说不错),并且非常高效。

关于c++ - 编写推送到客户端 (TCP) 的服务器应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7961325/

相关文章:

c++ - 在 qt 中的绘图中拖动误差条

qt - QJsonValue 的转换方法始终返回其默认值

node.js - HTTP : failed to make connection to backend: 0. 0.0.0 - 套接字 js

c - C语言连接邮件服务器的方法

java - UnresolvedAddressException 套接字 channel

c++ - 对象切片或 UB 风险?

c++ - 加密给定的文本字符串 - 凯撒密码

读取标准输入的 C++ 最快的 cin?

c++ - 在 Release模式下 boost 线程崩溃

c++ - QRegularExpression 源字符串中的匹配位置