QTcpScoket多线程
时间: 2023-12-12 18:05:39 浏览: 21
在Qt中,QTcpSocket可以使用多线程来实现并发处理多个客户端连接。一种常见的方式是使用Qt的信号槽机制和QThread类来实现多线程。以下是一个简单的示例代码:
```cpp
// MyThread.h
class MyThread : public QThread
{
Q_OBJECT
public:
explicit MyThread(qintptr ID, QObject *parent = 0);
void run();
signals:
void error(QTcpSocket::SocketError socketerror);
private:
QTcpSocket *socket;
qintptr socketDescriptor;
};
// MyThread.cpp
MyThread::MyThread(qintptr ID, QObject *parent) :
QThread(parent)
{
this->socketDescriptor = ID;
}
void MyThread::run()
{
// 初始化socket
socket = new QTcpSocket();
// 设置socket描述符
if(!socket->setSocketDescriptor(this->socketDescriptor))
{
emit error(socket->error());
return;
}
// 连接信号槽
connect(socket,SIGNAL(readyRead()),this,SLOT(readyRead()),Qt::DirectConnection);
connect(socket,SIGNAL(disconnected()),this,SLOT(disconnected()),Qt::DirectConnection);
// 启动事件循环
exec();
}
void MyThread::readyRead()
{
// 处理接收到的数据
QByteArray data = socket->readAll();
// ...
}
void MyThread::disconnected()
{
// 断开连接
socket->deleteLater();
exit(0);
}
// 在主线程中创建并启动新线程
void MyServer::newConnection()
{
while(tcpServer->hasPendingConnections())
{
QTcpSocket *socket = tcpServer->nextPendingConnection();
// 创建新线程处理连接
MyThread *thread = new MyThread(socket->socketDescriptor(),this);
connect(thread,SIGNAL(finished()),thread,SLOT(deleteLater()));
thread->start();
}
}
```
以上示例代码中,MyThread类继承自QThread,用于处理单个客户端连接。在run()函数中,初始化QTcpSocket并连接信号槽,启动事件循环。在readyRead()槽函数中处理接收到的数据,在disconnected()槽函数中断开连接。在主线程中,创建新线程处理连接,使用nextPendingConnection()获取新连接的socket描述符,创建新线程并启动。在新线程结束时自动删除线程对象。