QT学习笔记(13) QT下的UDP通信

一、UDP通信

  UDP通信没有明确的服务器端和客户端之分

  TCP通信像是打电话(必须要接通才能通信),UDP通信像是写信(不管能不能收到都发送出去)

  首先需要QUdpSOcket套接字,然后绑定bind()端口号和ip

  如果对方发送过来数据,套接字自动触发readyRead()方法

  套接字QUdpSOcket通过readDatagram()和writeDatagram()方法读取和写入数据

    

二、示例代码如下:

QT_HelloWorld12.pro

 1 #-------------------------------------------------
 2 #
 3 # Project created by QtCreator 2017-08-31T14:54:40
 4 #
 5 #-------------------------------------------------
 6
 7 QT       += core gui network
 8
 9 greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
10
11 TARGET = QT_HelloWorld12
12 TEMPLATE = app
13
14
15 SOURCES += main.cpp16         widget.cpp 17     widget_2.cpp
18
19 HEADERS  += widget.h 20     widget_2.h
21
22 FORMS    += widget.ui 23     widget_2.ui

main.cpp

 1 #include "widget.h"
 2 #include <QApplication>
 3 #include "widget_2.h"
 4
 5 int main(int argc, char *argv[])
 6 {
 7     QApplication a(argc, argv);
 8     Widget w;
 9     w.show();
10     widget_2 w2;
11     w2.show();
12
13     return a.exec();
14 }

widget.h

 1 #ifndef WIDGET_H
 2 #define WIDGET_H
 3
 4 #include <QWidget>
 5 #include <QUdpSocket>//UDP套接字
 6
 7 namespace Ui {
 8 class Widget;
 9 }
10
11 class Widget : public QWidget
12 {
13     Q_OBJECT
14
15 public:
16     explicit Widget(QWidget *parent = 0);
17     ~Widget();
18
19     void dealMsg();//槽函数,用来处理传递过来的数据
20
21 private slots:
22     void on_pushButton_send_clicked();
23
24 private:
25     Ui::Widget *ui;
26
27     QUdpSocket *udpSocket;
28 };
29
30 #endif // WIDGET_H

widget_2.h

 1 #ifndef WIDGET_2_H
 2 #define WIDGET_2_H
 3
 4 #include <QWidget>
 5 #include <QUdpSocket>//UDP套接字
 6 namespace Ui {
 7 class widget_2;
 8 }
 9
10 class widget_2 : public QWidget
11 {
12     Q_OBJECT
13
14 public:
15     explicit widget_2(QWidget *parent = 0);
16     ~widget_2();
17     void dealMsg();//槽函数,用来处理传递过来的数据
18
19 private slots:
20     void on_pushButton_send_clicked();
21
22 private:
23     Ui::widget_2 *ui;
24     QUdpSocket *udpSocket;
25 };
26
27 #endif // WIDGET_2_H

widget.cpp

 1 #include "widget.h"
 2 #include "ui_widget.h"
 3 #include <QUdpSocket>
 4 #include <QHostAddress>
 5
 6 Widget::Widget(QWidget *parent) :
 7     QWidget(parent),
 8     ui(new Ui::Widget)
 9 {
10     ui->setupUi(this);
11     setWindowTitle("8888");
12     //分配空间,指定父对象
13     udpSocket = new QUdpSocket(this);
14     //绑定 端口号
15     udpSocket->bind(8888);
16
17     //当对方成功发送数据过来,自动触发readyRead()
18     connect(udpSocket,&QUdpSocket::readyRead,this,&Widget::dealMsg);
19 }
20
21 Widget::~Widget()
22 {
23     delete ui;
24 }
25 void Widget::dealMsg()
26 {
27     //读取对方发送的内容
28     char buf[1024];
29     QHostAddress address;//对方地址
30     quint16 port;//对方端口
31     qint64 len = udpSocket->readDatagram(buf,sizeof(buf),&address,&port);
32     if(len>0)
33     {
34         //格式化 [127.0.0.1:8888] *******
35         QString str = QString("[%1:%2] %3")
36                 .arg(address.toString().arg(port).arg(buf));
37         //将内容放到编辑区
38         ui->textEdit_write->setText(str);
39     }
40 }
41
42 void Widget::on_pushButton_send_clicked()
43 {
44     //获取对方的IP和端口
45     QString ip = ui->lineEdit_ip->text();
46     qint16 port = ui->lineEdit_port->text().toInt();
47     //获取编辑区内容
48     QString str = ui->textEdit_write->toPlainText();
49     //给指定的IP发送数据
50     udpSocket->writeDatagram(str.toUtf8(),QHostAddress(ip),port);
51
52 }

widget_2.cpp

 1 #include "widget_2.h"
 2 #include "ui_widget_2.h"
 3
 4 widget_2::widget_2(QWidget *parent) :
 5     QWidget(parent),
 6     ui(new Ui::widget_2)
 7 {
 8     ui->setupUi(this);
 9     setWindowTitle("9999");
10     //分配空间,指定父对象
11     udpSocket = new QUdpSocket(this);
12     //绑定 端口号
13     //udpSocket->bind(9999);
14     udpSocket->bind(QHostAddress::AnyIPv4,8888);//如果是组播,则不能直接只绑定端口号(网段所有地址)
15     //加入某个组播
16     //组播地址是D类地址
17     udpSocket->joinMulticastGroup(QHostAddress("224.0.0.2"));
18     //udpSocket->leaveMulticastGroup(QHostAddress("224.0.0.2"));//离开组播
19
20     //当对方成功发送数据过来,自动触发readyRead()
21     connect(udpSocket,&QUdpSocket::readyRead,this,&widget_2::dealMsg);
22 }
23
24 widget_2::~widget_2()
25 {
26     delete ui;
27 }
28 void widget_2::dealMsg()
29 {
30     //读取对方发送的内容
31     char buf[1024];
32     QHostAddress address;//对方地址
33         //如果地址是255.255.255.255,则表示广播,在整个局域网内
34     quint16 port;//对方端口
35     qint64 len = udpSocket->readDatagram(buf,sizeof(buf),&address,&port);
36     if(len>0)
37     {
38         //格式化 [127.0.0.1:8888] *******
39         QString str = QString("[%1:%2] %3")
40                 .arg(address.toString().arg(port).arg(buf));
41         //将内容放到编辑区
42         ui->textEdit_write->setText(str);
43     }
44 }
45
46 void widget_2::on_pushButton_send_clicked()
47 {
48     //获取对方的IP和端口
49     QString ip = ui->lineEdit_ip->text();
50     qint16 port = ui->lineEdit_port->text().toInt();
51     //获取编辑区内容
52     QString str = ui->textEdit_write->toPlainText();
53     //给指定的IP发送数据
54     udpSocket->writeDatagram(str.toUtf8(),QHostAddress(ip),port);
55 }

widget.ui和widget_2.ui的界面设计

时间: 2024-10-19 20:43:21

QT学习笔记(13) QT下的UDP通信的相关文章

Qt学习笔记:Qt中使用Lua

今天想在Qt中使用Lua进行数据操作 结果发现在Qt中使用Lua的文章较少,虽然很简单,但是还是写出来提供入门,顺便记录一下 我使用的是Qt Creator 3.4.2,用的是mingw4.9.2的编译器 我在Lua官网下载lua版本是5.3.1 首先,在要Qt中进行编译Lua,拿到.a和dll这两个文件 在Qt Creator->文件->新建文件或项目->Library->C++库,接下来根据情况一路下一步完成创建 然后,右键自己的项目,选择添加现有文件,添加下载好的Lua文件中

Qt学习笔记-嵌入式qt程序支持显示中文

移植后得qt程序在开发板上运行时无法显示中文. 拷贝windows中的字体也不行. 从网上找到方法. 添加以下代码:需要头文件  #include <QTextCodec> QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8")); QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8")); //支持Tr中文 QText

QT学习笔记_Hello QT!

纠结了一番还是觉得swing太..还是撸QT吧 不过QT貌似也不是盖的,光配置环境弄了老半天.. 这次先输出hello QT ! 不过运行后的框太小了 ,虽然可以自己放大,但初始化不知道可不可以调? 慢慢来.. 输出部分使用了HTML 修改字体及颜色,居然可以混合HTML 这是极好的 #include <QApplication> #include <QLabel> int main(int argc,char *argv[]) { QApplication app(argc,ar

【Qt学习笔记】13.拖放技术:Drag & Drop

1.接受拖放 Drag & Drop 是一个界面操作,用于在两个窗口间传递数据. Drag Source: 拖放源窗口 Drag Target: 拖放目标窗口 拖放操作: 1.在源窗口:选中目标,按下鼠标,移动,拖至目标窗口(Drag) 2.在目标窗口:取消鼠标,到指定位置,松开鼠标(Drop) (按下ESC取消操作) MIME: MIME(Multipurpose Internet Mail Extensions)被传递的数据以MIME格式传送,它是多组type-data数据:(type0,

QT学习笔记—1

1.模态和非模态的区别:非模态可以同时操作两个窗口,模态的只能在顶层窗口关闭之后才能使用其他窗口 //同时显示出widget和dialog窗口,非模态     QDialog *dialog = new QDialog(this);     dialog->show(); //同时显示出widget和dialog窗口,模态     QDialog *dialog = new QDialog(this);     dialog->setModal(true);     dialog->sh

【Qt学习笔记】2.窗体Widget && 屏幕坐标 && 布局

一.窗体 在Qt中,把窗体(口)叫做Widget. Widget可以是主窗体(口),也可以是依附在主窗体(口)上的各种控件,作为子窗体,这两种窗口,分别称作顶级窗口(top-level widget)和子窗口(sub widget). 顶级窗口:一个标准的窗口,带边框.标题栏.若干按钮.(独立) 子窗口:在窗口里面的窗口,例如:按钮.文本框等控件.(不独立,随着父窗口移动) 注意: 1.每个子窗口都有一个父窗口 2.子窗口里面可能包含了若干子窗口,是一层一层的关系. 3.顶级窗口也有父窗口:就是

qt学习笔记(五) QGraphicsPixmapItem与QGraphicsScene的编程实例 图标拖动渐变效果

应大家的要求,还是把完整的project文件贴出来,大家省点事:http://www.kuaipan.cn/file/id_48923272389086450.htm 先看看执行效果,我用的群创7寸屏,主机是mini2440,分辨率是800*480,程序写比較粗糙,但对刚開始学习的人还是有一点启示,大家一起进步. qt中提供了QGphicsView,QGraphicsScene,QGraphicsItem,QGraphicsPixmapItem是QGraphicsItem的子类 分辨创建它们的实

qt在windows下的udp通信(最简单)

qt编程:windows下的udp通信 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:win7 开发环境:qt 功能: 用udp进行收发通信 界面: 源代码: LssHost.pro: [cpp] view plain copy #------------------------------------------------- # # Project created by QtCreator 2013-09-22T09:36:44

Qt学习笔记-Widget布局管理

Qt学习笔记4-Widget布局管理 以<C++ GUI Programming with Qt 4, Second Edition>为参考 实例:查找对话框 包含三个文件,finddialog.h,finddialog.cpp及main.cpp. //finddialog.h代码 #ifndef FINDDIALOG_H#define FINDDIALOG_H #include <QDialog> class QCheckBox;class QLabel;class QLineE

QT学习笔记(1)

采用QT创建一个GUI的应用程序时,都必须包含一个QApplication的对象,而对于非GUI的QT程序,可以使用不依赖QtGui库的QApplication QT的主要类: QLable                   标签类 QPushButton          按钮类 QVBoxLayout          竖布局管理器类 QHBoxLayout          横布局管理器类 QWidget                 窗口部件类 QGridLayout