QT 网络与通信之客户端(UDP)以及TCP和UDP比较

  1. 获得本机网络信息
    QHostInfo::localHostName(); 获得主机信息
    QList<QHostAddress> listAddress = hostInfo.addresses();获得主机的IP地址列表

    QString detail="";
    QList<QNetworkInterface> list=QNetworkInterface::allInterfaces();    // 获得主机的IP地址和网络接口列表
    for(int i=0;i<list.count();i++)
    {
        QNetworkInterface interface=list.at(i);
        detail=detail+tr("设备:")+interface.name()+"\n";                 // 获得网络接口的名称
        detail=detail+tr("硬件地址:")+interface.hardwareAddress()+"\n";  // 获得网络接口的硬件地址
        QList<QNetworkAddressEntry> entryList=interface.addressEntries();// 获得每个网络接口包括0或多个IP地址,包括子网掩码和广播地址
        for(int j=1;j<entryList.count();j++)
        {
            QNetworkAddressEntry entry=entryList.at(j);
            detail=detail+"\t"+tr("IP 地址:")+entry.ip().toString()+"\n";
            detail=detail+"\t"+tr("子网掩码:")+entry.netmask().toString() +"\n";
            detail=detail+"\t"+tr("广播地址:")+entry.broadcast().toString() +"\n";
        }
    }
    QMessageBox::information(this,tr("Detail"),detail);
    
  2. 基于UDP的工作原理
    UDP发送的是报文,报文大小不能超过64KB;
    UDP通信不与服务器建立连接,只负责调用发送函数向服务器发送数据报。服务器也从不接受连接,只负责调用接收函数,等待客户端的数据到达。
    QT中通过QUdpSocket实现UDP协议的编程。
    在这里插入图片描述
    服务器端发送信息

    udpSocket = new QUdpSocket(this);
    port = 5555;// 指定UDP广播端口号
    QString msg = TextLineEdit->text();// 发送信息
    int length=0;
    if(msg=="")
    {
    	return;
    }
    if((length=udpSocket->writeDatagram(msg.toLatin1(),
    msg.length(),QHostAddress::Broadcast,port))!=msg.length())
    {
    	return;
    }
    

    客户端接受信息

    port =5555;                                                      // 设置UDP的端口号参数,指定在此端口上监听数据
    udpSocket = new QUdpSocket(this);                                // 创建一个QUdpSocket
    connect(udpSocket,SIGNAL(readyRead()),this,SLOT(dataReceived()));// 连接QIODevice的readyRead()信号
    bool result=udpSocket->bind(port);                               // 绑定到指定的端口上,result为false时端口不可用
    
    void UdpClient::dataReceived()
    {
    	while(udpSocket->hasPendingDatagrams())                          // 判断是否有数据报可读,hasPendingDatagrams方法至少有一个数据报可读是返回true
    	{
        		QByteArray datagram;
        		datagram.resize(udpSocket->pendingDatagramSize());       // 获得第一个数据报长度
        		udpSocket->readDatagram(datagram.data(),datagram.size());// 读取数据报
        		QString msg=datagram.data();                             // 数据内容
    	}
    }
    
  3. 基于TCP的工作原理
    TCP传输控制协议(Transmission Control Protocol)是一种可靠的、面向连接、面向数据流的传输协议。
    HTTP/FTP等高层应用协议以TCP为基础。
    TCP适合连续数据传输。
    在这里插入图片描述

  4. TCP与UDP的比较
    在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章