QUdpSocket初次见面多多关照
QUdpSocket是Qt对UDP的封装。UDP是无连接的,发送数据前不需要建立连接,因此可靠性就没那么好了。不过UDP带来的好处就是效率高、占用资源少,还能实现一对多,多对多等交互方式。
QUdpSocket通信的步骤如下:
1.创建一个QUdpSocket对象,该对象绑定一个地址和端口(bind)。
2.创建另一个QUdpSocket对象,使用writeDatagram(需要填入目标host和端口)发送数据。
3.QUdpSocket收到数据时触发读取数据的信号,使用readDatagram读取数据。
举个例子:
1.首先用Qt界面设计师拖一界面如下:
上面一个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.运行程序看看效果。
在底下的窗口输入“hello,fearlazy”点击发送,结果收到的是个什么鬼?其实没必要大惊效果,多试几次总会成功一次的,毕竟我们说UDP是不可靠的。开玩笑的,写程序可不能靠运气。由于UDP是不可靠的,所以需要加入更多的人为控制让它传输的信息变得可靠才行。