7.4 Qt 开发 网络编程

Qt网络编程采用事件驱动模型,通过信号槽机制实现异步通信,避免了传统阻塞式网络编程的复杂性。

一、基于 TCP 的网络编程

TCP是面向连接的、可靠的、基于流的传输协议。在Qt中,服务器端使用QTcpServer监听连接,客户端使用QTcpSocket连接服务器。

  • 服务器端实现:
// 创建TCP服务器
QTcpServer *tcpServer = new QTcpServer(this);

// 监听指定地址和端口
if (!tcpServer->listen(QHostAddress::Any, 12345)) {
    qDebug() << "Server could not start:" << tcpServer->errorString();
} else {
    qDebug() << "Server started on port 12345";
}

// 新连接到达时的处理
connect(tcpServer, &QTcpServer::newConnection, this, [=]() {
    // 获取与客户端通信的套接字
    QTcpSocket *clientSocket = tcpServer->nextPendingConnection();
    
    // 记录客户端信息
    qDebug() << "New connection from:" << clientSocket->peerAddress().toString() 
             << ":" << clientSocket->peerPort();
    
    // 接收数据
    connect(clientSocket, &QTcpSocket::readyRead, this, [=]() {
        // TCP是流式协议,可能需要处理粘包/拆包
        QByteArray data = clientSocket->readAll();
        qDebug() << "Received from client:" << data;
        
        // 示例:回显数据
        clientSocket->write("Server echo: " + data);
    });
    
    // 处理连接断开
    connect(clientSocket, &QTcpSocket::disconnected, this, [=]() {
        qDebug() << "Client disconnected";
        clientSocket->deleteLater();  // 安全删除套接字
    });
    
    // 处理错误
    connect(clientSocket, &QTcpSocket::errorOccurred, this, [=](QAbstractSocket::SocketError error) {
        qDebug() << "Socket error:" << clientSocket->errorString();
    });
});
  • 客户端实现:
// 创建TCP套接字
QTcpSocket *tcpSocket = new QTcpSocket(this);

// 连接状态变化的处理
connect(tcpSocket, &QTcpSocket::connected, this, [=]() {
    qDebug() << "Connected to server";
    
    // 发送数据
    QString message = "Hello, Server!";
    tcpSocket->write(message.toUtf8());
    qDebug() << "Sent:" << message;
});

connect(tcpSocket, &QTcpSocket::disconnected, this, [=]() {
    qDebug() << "Disconnected from server";
});

// 异步连接到服务器
tcpSocket->connectToHost("127.0.0.1", 12345);

// 接收数据
connect(tcpSocket, &QTcpSocket::readyRead, this, [=]() {
    QByteArray data = tcpSocket->readAll();
    qDebug() << "Received from server:" << data;
});

// 错误处理
connect(tcpSocket, &QTcpSocket::errorOccurred, this, [=](QAbstractSocket::SocketError error) {
    qDebug() << "Connection error:" << tcpSocket->erro

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

C++/嵌入式开发 秋招面经 文章被收录于专栏

一名985硕,在25年秋招中斩获多个C++/嵌入式开发Offer。本专栏将分享我的面经,涵盖C/C++、操作系统、计算机网络、ARM体系与架构、Linux应用/驱动开发、Qt、通信协议及开发工具链等核心内容。

全部评论

相关推荐

前几天这下午那场面试真的是有史以来面试体验感最差的一次。本来这个职位和我就不是同一个领域的,我是做游戏的,你做短剧的来招我,所以我个人意向本来就不大,但hr昨天疯狂追着我,要给我安排面试才有了这一场面试。这是我第一次参加微信群面试,四个人面我一个。约的下午1:30,她们公司的面试官晚了10分钟才进入会议室,hr介绍说他是什么什么总,所以我也礼貌性的随着一起叫的什么什么总。上来之后让我自我介绍,完了之后就开始他的表演了。程高高在上的态度,语气中全程带着嘲讽和贬低的意思,说我做的这个工作谁都能做,你的价值是什么?完全没看到你的价值。我礼貌回答了我觉得自己做的有价值的地方,他就开始疯狂diss&nbsp;说你觉得自己做的这个事情成果好吗?我说我觉得我做的成果挺好的。接下来就是无尽的质疑和贬低的话,面到一半我真的气的想甩手机走了,但是由于第一次遇到这种情况不知道怎么办只是很气的状态,所以出于礼貌没有打断面试的进行,最后我真的面不下去了,他问我还有什么问题吗?我说没了,然后他就开始让其他面试官问我,其他面试官还是挺礼貌的,所以我也礼貌回答了,面试就结束了。嗷对了,微信群面试的时候就让我一个人开了摄像头,其他几个面试官都没开。一点小建议:面试本质是双向选择,对方不尊重你,也暴露了他们的团队文化。遇到这种情况,不用急着怼回去,像你一样冷静记录、面试结束后礼貌反馈给HR,已经很得体了。下次可以提前确认:面试官是否开摄像头?面试领域是否匹配?能筛掉不少坑。记住:不是你不够好,是对方不配。
牛客54854077...:没有回怼回去,看着不够爽
面试体验最好和最差的公司
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
4
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务