原创文章,转载时请注明出处:http://blog.csdn.net/str999_cn/article/details/30200811
直接上代码。
客户端:
#include "widget.h"
#include <QtNetwork/QUdpSocket>
#include <QTextCodec>
#include <QPushButton>
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
//初始化QUdpSocket
udpSocket=new QUdpSocket(this);
connect(udpSocket,&QUdpSocket::readyRead,
this,&Widget::slot_udpReadyRead);
//发送消息到服务器
btnSend=new QPushButton("SEND",this);
connect(btnSend,&QPushButton::clicked,
this,&Widget::slot_btnClicked);
}
void Widget::slot_btnClicked()
{
QByteArray datagram;
QDataStream out(&datagram,QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_5_3);
//立即发送
QString str="hello";
out<<str;
udpSocket->writeDatagram(datagram,QHostAddress("192.192.10.10"),4321);
}
void Widget::slot_udpReadyRead()
{
QByteArray datagram;
while(udpSocket->hasPendingDatagrams())
{
datagram.resize(udpSocket->pendingDatagramSize());
udpSocket->readDatagram(datagram.data(),datagram.size());
}
//提取服务器回发消息里的信息
//QDataStream in(&datagram,QIODevice::ReadOnly);
QTextCodec *codec=QTextCodec::codecForName("UTF-16BE");
qDebug()<<"length: "<<datagram.length();
QString myStr=codec->toUnicode(datagram.right(datagram.length()-4));
qDebug()<<myStr;
}
服务器端:
运行后的情况:
客户端发送“hello”到服务器,服务器收到的数据是<<0,0,0,10,0,104,0,101,0,108,0,108,0,111>>,其中,前4个字节表示本条消息的长度,即10个字节。后面是消息的具体内容。由于QString采用UNICODE,所以用2个字节代表一个字母,比如,h是《0,104》。
由于收到的Bin本身就是二进制数据,所以回发时,直接把Bin作为参数发送即可,外面不能再套一层《》符号
在客户端,接收到服务器回发的消息,打印出数据总长度,14个字节。其中前4个字节也是表示本条消息的长度,所以在提取具体数据时,需要把前4个表示长度的字节去除。最后提取出我们所需的数据hello。