QUdpSocket初次见面多多关照

    QUdpSocket是Qt对UDP的封装。UDP是无连接的,发送数据前不需要建立连接,因此可靠性就没那么好了。不过UDP带来的好处就是效率高、占用资源少,还能实现一对多,多对多等交互方式。

    QUdpSocket通信的步骤如下:

    1.创建一个QUdpSocket对象,该对象绑定一个地址和端口(bind)。

    2.创建另一个QUdpSocket对象,使用writeDatagram(需要填入目标host和端口)发送数据。

    3.QUdpSocket收到数据时触发读取数据的信号,使用readDatagram读取数据。

    

    举个例子:

    1.首先用Qt界面设计师拖一界面如下:

blob.png

   上面一个QTextEdit作为显示服务端接收到的数据,下面一个QTextEdit用于输入要发送的数据,还有一个发送按钮。

  2.写一个服务端类继承于QObject,该类只有一个QUdpSocket指针类型的成员变量m_pSocket。在类的构造函数中创建m_pSocket对象,然后执行bind操作,最后连接m_pSocket对象的readyRead信号。

UdpServer::UdpServer(QObject *parent) : QObject(parent)
{
    m_pSocket = new QUdpSocket;
    m_pSocket->bind(QHostAddress::Any,3333);  //绑定3333端口
    connect(m_pSocket,SIGNAL(readyRead()),this,SLOT(slotReadyRead()));
}

  3.当m_pSocket收到数据时发送readyRead信号,触发slotReadyRead槽,在该槽函数中使用readDatagram读取数据。

void UdpServer::slotReadyRead()
{
    while(m_pSocket->hasPendingDatagrams()){
        qint64 nSize = m_pSocket->pendingDatagramSize();
        char* buf = new char[nSize];
        QHostAddress host;
        quint16 port;
        m_pSocket->readDatagram(buf,nSize,&host,&port); //读取数据,为了简单一次性读完。

        
        QString msg = QString("from:%1:%2 %3").arg(host.toString()).arg(port).arg(buf);
        emit sig_recvMsg(msg);  //将组装的信息发送到界面

        //m_pSocket->writeDatagram(QString("recv msg").toUtf8().data(),host,port);
    }
}

  4.最后只需要创建一个QUdpSocket发送数据就OK了。为了节省时间,直接在发送按钮的点击槽函数中完成。

void Widget::on_btn_client_clicked()
{
    QUdpSocket* socket = new QUdpSocket;
    connect(socket,SIGNAL(readyRead()),this,SLOT(slotReadyRead()));

    QHostAddress host("127.0.0.1");
    quint16 port = 3333;  //端口为服务端绑定的端口
    socket->writeDatagram(ui->textEdit_client->toPlainText().toUtf8().data(),host,port); //发送数据
}

 5.运行程序看看效果。

blob.png

在底下的窗口输入“hello,fearlazy”点击发送,结果收到的是个什么鬼?其实没必要大惊效果,多试几次总会成功一次的,毕竟我们说UDP是不可靠的。开玩笑的,写程序可不能靠运气。由于UDP是不可靠的,所以需要加入更多的人为控制让它传输的信息变得可靠才行。



演示站
上一篇:Qt封装的websocket了解一下
下一篇:QLocalSocket又是个什么玩意?

发表评论