整体思路
- 搭建l两个ui界面(实现两个界面信息的发送与接收)
- 一个端口具体实现如下
- 初始化属性:发送端口,接收端口,接收IP地址
- 创建套接字
- 绑定自身端口
- 点击发送按钮,发送报文
- 发送消息
- 消息追加到聊天记录窗口
- 清空输入框
- 监听报文
- 数据同步到聊天记录窗口
具体实现
以Qt Widgets Application为模板,建立项目,新类命名为udp1,继承自QWidgets,建立完成后,对udp1.ui进行设计,界面如下:
在.pro文件中加上语句
QT += network
这样就可以使用QUdpSocket头文件
在udp1.h中声明套接字
#include<QUdpSocket>
public:
//声明套接字
QUdpSocket* udp;
udp1.cpp进行修改如下:
#include "udp1.h"
#include "ui_udp1.h"
Udp1::Udp1(QWidget *parent) :
QWidget(parent),
ui(new Ui::Udp1)
{
ui->setupUi(this);
//设置属性
ui->myport->setText("8888");
ui->toport->setText("9999");
ui->toip->setText("127.0.0.1");
//创建套接字
udp = new QUdpSocket(this);
//绑定自身端口号
udp->bind(ui->myport->text().toInt());
//点击发送按钮,发送报文
connect(ui->sendBtn,&QPushButton::clicked,[=](){
//输入内容纯文本发送用text edit的toPlainText函数(该函数为QString类型,利用成员函数
//toUtf8()转换为QByteArray),带有颜色等复杂特效的文字用
//toHtml函数
//书写报文 参数1 内容 参数2 对方IP 参数3 对方端口
udp->writeDatagram(ui->input->toPlainText().toUtf8(),QHostAddress(ui->toip->text()),
ui->toport->text().toInt());
//聊天记录窗口进行记录
ui->record->append("my say:"+ui->input->toPlainText());
//清空输入
ui->input->clear();
});
//接收数据
//发送数据后,套接字接收端会自动有一个readyRead信号
connect(udp,&QUdpSocket::readyRead,[=](){
//获取报文长度
qint64 size = udp->pendingDatagramSize();
QByteArray array = QByteArray(size,0);
//char* QByteArray::data()
//读取报文
udp->readDatagram(array.data(),size);
//将数据同步到聊天记录中
ui->record->append(array);
});
}
Udp1::~Udp1()
{
delete ui;
}
为项目添加新文件,选择Qt->设计师界面类,对udp2.ui进行和udp1.ui同样的修改,dup2.h和udp2.cpp模仿udp1.h,udp2.cpp进行同样修改,只需要更改端口号即可
完整程序如下:
main.cpp
//main.cpp
#include "udp1.h"
#include <QApplication>
#include"udp2.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Udp1 w;
w.show();
udp2 u2;
u2.show();
return a.exec();
}
udp1.h
//udp1.h
#ifndef UDP1_H
#define UDP1_H
#include <QWidget>
#include<QUdpSocket>
namespace Ui {
class Udp1;
}
class Udp1 : public QWidget
{
Q_OBJECT
public:
explicit Udp1(QWidget *parent = 0);
~Udp1();
private:
Ui::Udp1 *ui;
public:
//声明套接字
QUdpSocket* udp;
};
#endif // UDP1_H
udp1.cpp
//udp1.cpp
#include "udp1.h"
#include "ui_udp1.h"
Udp1::Udp1(QWidget *parent) :
QWidget(parent),
ui(new Ui::Udp1)
{
ui->setupUi(this);
//设置属性
ui->myport->setText("8888");
ui->toport->setText("9999");
ui->toip->setText("127.0.0.1");
//创建套接字
udp = new QUdpSocket(this);
//绑定自身端口号
udp->bind(ui->myport->text().toInt());
//点击发送按钮,发送报文
connect(ui->sendBtn,&QPushButton::clicked,[=](){
//输入内容纯文本发送用text edit的toPlainText函数(该函数为QString类型,利用成员函数
//toUtf8()转换为QByteArray),带有颜色等复杂特效的文字用
//toHtml函数
//书写报文 参数1 内容 参数2 对方IP 参数3 对方端口
udp->writeDatagram(ui->input->toPlainText().toUtf8(),QHostAddress(ui->toip->text()),
ui->toport->text().toInt());
//聊天记录窗口进行记录
ui->record->append("my say:"+ui->input->toPlainText());
//清空输入
ui->input->clear();
});
//接收数据
//发送数据后,套接字接收端会自动有一个readyRead信号
connect(udp,&QUdpSocket::readyRead,[=](){
//获取报文长度
qint64 size = udp->pendingDatagramSize();
QByteArray array = QByteArray(size,0);
//char* QByteArray::data()
//读取报文
udp->readDatagram(array.data(),size);
//将数据同步到聊天记录中
ui->record->append(array);
});
}
Udp1::~Udp1()
{
delete ui;
}
udp2.h
//udp2.h
#ifndef UDP2_H
#define UDP2_H
#include <QWidget>
#include<QUdpSocket>
namespace Ui {
class udp2;
}
class udp2 : public QWidget
{
Q_OBJECT
public:
explicit udp2(QWidget *parent = 0);
~udp2();
private:
Ui::udp2 *ui;
public:
QUdpSocket* udp;
};
#endif // UDP2_H
udp2.cpp
//udp2.cpp
#include "udp2.h"
#include "ui_udp2.h"
udp2::udp2(QWidget *parent) :
QWidget(parent),
ui(new Ui::udp2)
{
ui->setupUi(this);
//设置属性
ui->myport->setText("9999");
ui->toport->setText("8888");
ui->toip->setText("127.0.0.1");
//创建套接字
udp = new QUdpSocket(this);
//绑定自身端口号
udp->bind(ui->myport->text().toInt());
//点击发送按钮,发送报文
connect(ui->sendBtn,&QPushButton::clicked,[=](){
//输入内容纯文本发送用text edit的toPlainText函数(该函数为QString类型,利用成员函数
//toUtf8()转换为QByteArray),带有颜色等复杂特效的文字用
//toHtml函数
//书写报文 参数1 内容 参数2 对方IP 参数3 对方端口
udp->writeDatagram(ui->input->toPlainText().toUtf8(),QHostAddress(ui->toip->text()),
ui->toport->text().toInt());
//聊天记录窗口进行记录
ui->record->append("my say:"+ui->input->toPlainText());
//清空输入
ui->input->clear();
});
//接收数据
//发送数据后,套接字接收端会自动有一个readyRead信号
connect(udp,&QUdpSocket::readyRead,[=](){
//获取报文长度
qint64 size = udp->pendingDatagramSize();
QByteArray array = QByteArray(size,0);
//char* QByteArray::data()
//读取报文
udp->readDatagram(array.data(),size);
//将数据同步到聊天记录中
ui->record->append(array);
});
}
udp2::~udp2()
{
delete ui;
}
实验结果如下: