저는 프로그램을 작성 중이며 한 번에 여러 클라이언트 연결을 처리 할 수 있어야하는 서버가 있습니다. 서버 생성자에서서버에있는 여러 사용자의 연결 처리
:
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
슬롯 I는 Qt는 라이브러리를 사용하고
, 그래서 나는이 같은 새로운 연결을 처리 :
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
은 클라이언트가 프로그램을 종료 할 때까지 항상 존재합니다.
정기적으로 사용자가 동기화 요청을 자주 보내도록하기 때문에 여러 연결을 처리하는 좋은 방법입니까? 그렇지 않다면 연결을 어떻게 처리해야합니까?
새로운 연결을 자동으로 처리하기 위해 새 스레드를 시작하는 것은 매우 비생산적인 일입니다. 당신은'QThread :: idealThreadCount'보다 더 많은 CPU 바운드 쓰레드를 원하지 않습니다. –