560 字
3 分钟
Qt中服务端的创建
tcp 服务器端创建:
- 在qt的项目文件中添加如下代码,导入网络模块:
QT += network- 添加头文件:
#include <QTcpServer>#include <QTcpSocket>- 创建服务器对象:
QTcpServer *server = new QTcpServer(this);这里的this表示将服务器对象作为当前类的成员变量,方便在其他函数中使用。或者可以直接将*server定义在类的成员变量中。如
QTcpServer *server;然后再在类的构造函数中初始化服务器对象:
server = new QTcpServer(this);- 连接信号和槽(在构造函数中):
connect(server, &QTcpServer::newConnection, this, &MyServer::newConnection);这里的newConnection是服务器对象的信号,当有新的客户端连接时会触发该信号。this表示将当前类作为槽函数的对象,&MyServer::newConnection表示当前类的槽函数。
在当前类中添加槽函数newConnection:
void MyServer::newConnection(){ QTcpSocket *socket = server->nextPendingConnection(); connect(socket, &QTcpSocket::readyRead, this, &MyServer::readyRead); connect(socket, &QTcpSocket::disconnected, socket, &QTcpSocket::deleteLater);}这里的nextPendingConnection表示获取下一个Pending的连接,返回一个QTcpSocket对象。connect表示将readyRead信号连接到当前类的readyRead槽函数。disconnected表示当客户端断开连接时触发该信号。deleteLater表示将该QTcpSocket对象删除。或者自定义一个槽函数,在该槽函数中处理断开连接的逻辑。如:
void MyServer::socketDisconnected(){ QTcpSocket *socket = qobject_cast<QTcpSocket*>(sender()); if(socket) { // 处理断开连接的逻辑,如: qDebug() << "Socket disconnected:" << socket->peerAddress().toString(); }}在当前类中添加槽函数readyRead:
void MyServer::readyRead(){ QTcpSocket *socket = qobject_cast<QTcpSocket*>(sender()); if(socket) { QByteArray data = socket->readAll();//或者QString data = socket->readAll(); // 处理收到的数据,如: qDebug() << "Received data:" << data; }}这里的qobject_cast<QTcpSocket*>(sender())表示将信号发送者转换为QTcpSocket对象。readAll表示读取所有可用的数据。
- 监听端口:
server->listen(QHostAddress::Any, 8888);这里的QHostAddress::Any表示监听所有可用的网络接口,8888表示监听的端口号。监听成功后,服务器对象会触发newConnection信号,此时会调用newConnection槽函数,并创建一个QTcpSocket对象,并连接readyRead信号和readyRead槽函数。
- 服务端发送数据:
void MyServer::sendDataToClient(QTcpSocket *socket, const QByteArray &data){ if(socket && socket->state() == QTcpSocket::ConnectedState) { socket->write(data); }}这里的QTcpSocket *socket表示要发送数据的客户端socket对象。const QByteArray &data表示要发送的数据。write表示将数据写入socket对象。
最后更新于 2025-11-13,距今已过 8 天
部分内容可能已过时