处理来自服务器上多个用户的连接

Handling connections from multiple users on a server

本文关键字:用户 连接 服务器 处理      更新时间:2023-10-16

我正在写一个程序,我有一个服务器,需要能够处理多个客户端连接一次做许多不同的事情。

我正在使用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。