您的位置:首页 > 游戏 > 手游 > 绵阳科技城建设_开发公司年终工作总结_郑州网站排名推广_百度竞价推广屏蔽软件

绵阳科技城建设_开发公司年终工作总结_郑州网站排名推广_百度竞价推广屏蔽软件

2025/4/22 15:48:47 来源:https://blog.csdn.net/weixin_69851948/article/details/146547477  浏览:    关键词:绵阳科技城建设_开发公司年终工作总结_郑州网站排名推广_百度竞价推广屏蔽软件
绵阳科技城建设_开发公司年终工作总结_郑州网站排名推广_百度竞价推广屏蔽软件

C++ Qt 网络编程学习笔记


一、网络编程基础知识
  1. IP地址与端口

    • IP地址:设备在网络中的唯一标识(IPv4如192.168.1.1,IPv6如fe80::1
    • 端口号:应用程序的通信入口(0-65535,1024以下为系统保留)
    • 组合意义IP:Port 唯一标识网络中的进程
  2. 封包与拆包

    • 封包:将数据按协议格式封装成网络数据包

    • 拆包:从接收的字节流中解析出完整数据包

    常见问题

    • TCP粘包(需自定义协议处理消息边界)
    • UDP无粘包(每个数据报独立)

二、UDP协议编程
  1. 核心特点

    • 无连接、不可靠但高效
    • 适用于实时性要求高的场景(如视频流)
  2. 编程流程

    mermaid

    Copy

    graph LR
    A[创建QUdpSocket] --> B[绑定端口bind()]
    B --> C[接收数据readDatagram()]
    B --> D[发送数据writeDatagram()]
    
  3. 服务端实现

    cpp

    Copy

    // 初始化Socket
    void Server::initSocket() {udpSocket = new QUdpSocket(this);udpSocket->bind(QHostAddress::LocalHost, 7755); // 绑定本地端口connect(udpSocket, &QUdpSocket::readyRead,this, &Server::readPendingDatagrams); // 事件驱动
    }// 读取数据报
    void Server::readPendingDatagrams() {while (udpSocket->hasPendingDatagrams()) {QByteArray datagram;datagram.resize(udpSocket->pendingDatagramSize());QHostAddress sender;quint16 senderPort;udpSocket->readDatagram(datagram.data(), datagram.size(),&sender, &senderPort);// 处理datagram数据...}
    }
    
  4. 客户端发送

    cpp

    Copy

    QUdpSocket udpSocket;
    QByteArray data = "Hello UDP!";
    qint64 ret = udpSocket.writeDatagram(data.constData(), data.size(),QHostAddress::LocalHost, 7755); // 目标地址+端口
    

三、TCP协议编程
  1. 核心特点

    • 面向连接、可靠传输
    • 适用于需要数据完整性的场景(如文件传输)
  2. 编程流程

    mermaid

    Copy

    graph TB
    Server[服务端] -->|1. 监听| listen()
    Client[客户端] -->|2. 连接| connectToHost()
    Server -->|3. 接受连接| nextPendingConnection()
    Both -->|4. 通信| read()/write()
    
  3. 服务端实现

    cpp

    Copy

    // 创建QTcpServer
    QTcpServer *tcpServer = new QTcpServer(this);
    if (!tcpServer->listen(QHostAddress::Any, 8888)) {// 错误处理...
    }// 新连接信号
    connect(tcpServer, &QTcpServer::newConnection, [=](){QTcpSocket *clientSocket = tcpServer->nextPendingConnection();connect(clientSocket, &QTcpSocket::readyRead, [=](){QByteArray data = clientSocket->readAll();// 处理数据...});
    });
    
  4. 客户端实现

    cpp

    Copy

    QTcpSocket *tcpSocket = new QTcpSocket(this);
    tcpSocket->connectToHost("127.0.0.1", 8888);// 连接成功信号
    connect(tcpSocket, &QTcpSocket::connected, [=](){tcpSocket->write("Hello TCP!");
    });// 接收数据
    connect(tcpSocket, &QTcpSocket::readyRead, [=](){QByteArray data = tcpSocket->readAll();
    });
    

四、关键对比
特性UDPTCP
连接方式无连接面向连接
可靠性可能丢包可靠传输
传输效率相对较低
数据边界保留消息边界字节流模式
适用场景视频会议、实时游戏文件传输、Web服务

五、注意事项
  1. TCP粘包处理
    • 固定长度法
    • 分隔符法
    • 长度前缀法(推荐)
  2. 跨平台特性
    • Qt网络模块自动处理不同平台的套接字差异
  3. 线程安全
    • 建议在单独的线程中处理网络I/O
  4. 错误处理
    • 必须处理errorOccurred信号
    • 检查所有网络操作的返回值

六、扩展学习
  1. 高级主题
    • 多线程网络服务
    • SSL加密通信(QSslSocket)
    • HTTP协议实现(QNetworkAccessManager)
  2. 调试技巧
    • 使用qDebug() << "Received:" << data;输出调试信息
    • 使用Wireshark抓包分析

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com