处理来自服务器上多个用户的连接
Handling connections from multiple users on a server
我正在写一个程序,我有一个服务器,需要能够处理多个客户端连接一次做许多不同的事情。
我正在使用Qt库,所以我处理这样的新连接:
在服务器构造函数中:
Server::Server(QObject* parent): QObject(parent)
{
connect(&server, SIGNAL(newConnection()), //server is a QTcpServer object
this, SLOT(acceptConnection()));
qDebug() << "[" << currentTime() << "] " << "Server started.";
server.listen(QHostAddress::Any, PORT_NUMBER);
qDebug() << "[" << currentTime() << "] " << "Server listening.";
}
acceptConnection
槽位:
void Server::acceptConnection()
{
client = server.nextPendingConnection(); //client is a QTcpSocket* object
connect(client, SIGNAL(readyRead()), //When there is data to be read
this, SLOT(startRead()));
}
startRead
槽位:
void Server::startRead()
{
char serverReceiveBuf[65536]; //A buffer for the data sent to the server
client->read(serverReceiveBuf, client->bytesAvailable());
handleConnection(serverReceiveBuf); //Do something with that data
}
我不打算给出handleConnection
函数,因为它有点长,我认为它对这个问题没有必要。
我担心的是延迟。如果我有一个或两个用户,这很好。但我还没有测试过很多并发用户。客户端发送一个同步信号,请求服务器验证客户端拥有的数据与服务器上的数据是否匹配。我每250毫秒发送一次请求,所以如果并发用户多一些,客户端可能会因为其他客户端发送同步请求而每250毫秒等待太长时间。
至少我是这么认为的。Qt非常强大,但我不完全确定当接收到一个信号时,是否会自动创建一个新线程来处理连接。如果我没有弄错的话,我目前处理连接的方式涉及到排队,这样当服务器接收到信号时,它将按照接收到的顺序处理请求。重要的是要注意,在客户端自己终止连接之前,我不会调用client->close()
,因此一旦调用了client = server.nextPendingConnecting();
, client
将始终存在,直到客户端终止其端程序。
这是处理多个连接的好方法,因为我将经常让用户发送同步请求?如果不是,我应该如何处理连接呢?
我没有测试过很多并发用户。
你怀疑Qt可以支持的客户端数量,但没有测试它,你不会知道这个限制是什么,特别是当你运行的硬件在这里可以产生相当大的差异。
我有几百个同时连接,每个连接不断地发送和接收数据没有问题,但我的设置可能与您的不同。
至于如何设置服务器,我看到您提供的代码有一个直接的问题。在函数startRead()中,您应该注意到此时接收到的数据可能是不完整的。
你需要知道你什么时候收到了完整的信息。最简单的方法是在每条消息前加上消息的大小(以字节为单位),然后在接收到消息开始时,读取大小并继续将数据追加到缓冲区中,直到获得完整的消息,此时可以调用handleConnection。
- C++如何通过用户输入删除列表元素
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 如何使用用户输入在C++中正确填充2D数组
- C++MySQL C api用户输入行
- 当套接字连接断开时检测C/C++Unix
- 使用用户定义函数的字符串反转
- 用户定义函数中的指针和输入
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- 如何只允许用户输入正整数
- C++如何计算用户输入的数字中的偶数位数
- 是否有 Windows 用户空间函数来枚举连接的网络共享?
- 导入机器人机械臂(6轴)的连接部件,并通过用户输入(C++代码)使每个关节旋转
- 如何将C 中的后端写入与TCL/TCK用户界面连接
- 如何检测用户何时与网络断开连接
- 在Qt C++中连接用户特定的DBus会话
- Wt: 1.5 GB用于运行论坛(即使只有一个用户连接).这正常吗?
- 处理来自服务器上多个用户的连接
- C++程序在执行时崩溃且没有错误消息 con = 驱动程序>连接(主机、用户、通行证);
- Paho MQTT c++连接用户和密码
- 如果 else 语句连接到子字符串,则使用只会导致 else-语句仅包含用户输入的任何内容