三、Udp广播
简介:利用Udp通讯,完成本机的收发功能。
在这个学习过程,有一个问题,一直未能解决:
在我本机中,已经能够实现收发功能,但是,每次只有一个字符的显示,这是为什么?
步骤:
1. 绘制界面(本界面比较简单)
服务器界面
客户端界面
2. 服务器端代码:
1.构造函数中完成套接字,定时器已经定时器时间和槽函数的连接
{
ui->setupUi(this);
udpSocket = new QUdpSocket(this);
timer = new QTimer(this);
connect(timer, SIGNAL(timeout()),
this, SLOT(sendMessage()));
isStarted = false;
}
2.开始按钮槽函数的编写
void UdpDialog::on_pushButton_clicked()
{
if(isStarted == false){
isStarted = true;
timer->start(1000);
ui->pushButton->setText("停止");
ui->messageEdit->setEnabled(false);
ui->portEdit->setEnabled(false);
}
else{
isStarted = false;
timer->stop();
ui->pushButton->setText("开始");
ui->messageEdit->setEnabled(true);
ui->portEdit->setEnabled(true);
}
}
3.定时器所连接槽函数的编写
void UdpDialog::sendMessage()
{
QString msg = ui->messageEdit->text();
quint16 port = ui->portEdit->text().toShort();
quint16 sizemsg = msg.size();
udpSocket->writeDatagram(msg.toUtf8(),sizemsg,
QHostAddress::Broadcast,port);
}
3. 客户端代码:
①:构造函数,完成套接字的创建,按钮状态的初始化
{
ui->setupUi(this);
udpSocket = new QUdpSocket;
isStarted = false;
}
②:开始按钮的槽函数
void RecDialog::on_pushButton_clicked()
{
if(isStarted == false){
isStarted = true;
port = ui->lineEdit->text().toShort();
udpSocket->bind(port);
connect(udpSocket, SIGNAL(readyRead()),
this, SLOT(messageReceive()));
ui->lineEdit->setEnabled(false);
ui->pushButton->setText("停止接收");
}
else{
isStarted = false;
udpSocket->close();
ui->lineEdit->setEnabled(true);
ui->pushButton->setText("开始接收");
}
}
③:readReady对应槽函数的编写
void RecDialog::messageReceive()
{
if(udpSocket->hasPendingDatagrams()){
QByteArray buffer;
buffer.resize(udpSocket->hasPendingDatagrams());
udpSocket->readDatagram(buffer.data(), buffer.size());
ui->listWidget->addItem(buffer);
ui->listWidget->scrollToBottom();
}
}
4.总结
虽然能够实现最简单的功能了,但是单个字符的传输,我还是没能解决。
多看看帮助手册,确实会有收获!