1.首先是UDP 数据传输,
DP 的客户端
1.我们在自定义的类里面 定义 套接字,和时间定时器
QUdpSocket *m_udp;
QTimer *m_pTimer;
头文件:
#include
#include
2.在构造函数的时候我们 初始化数据
- m_udp = new QUdpSocket;//创建udp套接字
- m_pTimer = new QTimer;//创建定时器
- m_pTimer->setInterval(1000);//时间间隔1s。
- connect(m_pTimer,&QTimer::timeout,this,&udpclient::writedata);//每隔1s,发送数据,并且触发槽函数
- m_pTimer->start();//启动定时器
3.在析构函数的时候我们释放 数据
- delete m_udp;
- delete m_pTimer;
4.写槽函数
- //发送数据报。
- void udpclient::writedata()
- {
- QByteArray data = "hello";
- m_udp->writeDatagram(data,data.size(),QHostAddress("191.161.110.1"),10001);//这里是自己主机的ip 和端口号
- }
客户端的所有的代码:
udpclicent.h
- #ifndef UDPCLIENT_H
- #define UDPCLIENT_H
-
- #include
- #include
- #include
- #include
-
- using namespace std;
-
- class udpclient : public QObject
- {
- Q_OBJECT
- public:
- explicit udpclient(QObject *parent = 0);
- ~udpclient();
- signals:
-
- public slots:
- void writedata();
- private:
- QUdpSocket *m_udp;
- QTimer *m_pTimer;
- };
-
- #endif // UDPCLIENT_H
mian.cpp
- #include
- #include
-
- int main(int argc, char *argv[])
- {
- QCoreApplication a(argc, argv);
- udpclient *client = new udpclient();
- return a.exec();
- }
-
udpclient.cpp
- #include "udpclient.h"
- #include <QByteArray>
-
-
- udpclient::udpclient(QObject *parent) : QObject(parent)
- {
- m_udp = new QUdpSocket;//创建udp套接字
-
-
- m_pTimer = new QTimer;//创建定时器
- m_pTimer->setInterval(1000);//时间间隔1s。
- connect(m_pTimer,&QTimer::timeout,this,&udpclient::writedata);//每隔1s,发送数据
- m_pTimer->start();//启动定时器
- }
-
- udpclient::~udpclient()
- {
- delete m_udp;
- delete m_pTimer;
- }
- //发送数据报。
- void udpclient::writedata()
- {
- QByteArray data = "hello";
- m_udp->writeDatagram(data,data.size(),QHostAddress("192.168.150.1"),10001);//这里是自己主机的ip 和端口号
- }
-
2.UDP 的服务器数据的接收
1.我们在自定义的类里面 定义 套接字
QUdpSocket *m_udp;
头文件:
#include
2.在构造函数的时候我们 初始化数据
- //创建套接字
- m_udp = new QUdpSocket();
- //服务器绑定电脑ip或端口
- m_udp->bind(QHostAddress("192.168.150.1"),10001);
- //接收数据
- connect(m_udp,&QUdpSocket::readyRead,this,&udpsever::recvdat);//套接字的接收函数,来触发自定义的显示函数
3.析构函数我们,关闭套接字
delete m_udp;
4.自定义的槽函数
-
- void udpsever::recvdat()
- {
- QByteArray pa;
- if(m_udp->hasPendingDatagrams())//首先判断是否读到数据报。
- {
- pa.resize(m_udp->pendingDatagramSize());//设置字符数组的大小。
- m_udp->readDatagram(pa.data(),pa.size());//udp套接字读取数据报
- //打印pa的数据
- qDebug() << pa.data() << endl;
- }
- }
5.UDP所有的代码:
udpsever.h
- #ifndef UDPSEVER_H
- #define UDPSEVER_H
-
- #include
- #include
-
- class udpsever : public QObject
- {
- Q_OBJECT
- public:
- explicit udpsever(QObject *parent = 0);
- ~udpsever();
- signals:
-
- public slots:
- void recvdat();
- private:
- QUdpSocket *m_udp;
- };
-
- #endif // UDPSEVER_H
main.cpp
- #include
- #include "udpsever.h"
-
- int main(int argc, char *argv[])
- {
- QCoreApplication a(argc, argv);
- udpsever *server = new udpsever;
- return a.exec();
- }
-
udpsever.cpp
- #include "udpsever.h"
- #include <QDebug>
- #include <QByteArray>
-
- udpsever::udpsever(QObject *parent) : QObject(parent)
- {
- //创建套接字
- m_udp = new QUdpSocket();
- //服务器绑定电脑ip或端口
- m_udp->bind(QHostAddress("192.168.150.1"),10001);
- //接收数据
- connect(m_udp,&QUdpSocket::readyRead,this,&udpsever::recvdat);
- }
-
- udpsever::~udpsever()
- {
- delete m_udp;
- }
-
- void udpsever::recvdat()
- {
- QByteArray pa;
- if(m_udp->hasPendingDatagrams())//首先判断是否读到数据报。
- {
- pa.resize(m_udp->pendingDatagramSize());//设置字符数组的大小。
- m_udp->readDatagram(pa.data(),pa.size());//udp套接字读取数据报
- //打印pa的数据
- qDebug() << pa.data() << endl;
- }
- }
-
6.UDP 总结:
客户端部分:只要初始化套接字,然后利用函数writeDatagram 发送信息。
服务器部分: 初始化套接字,绑定IP 和端口, 然后利用函数QUdpSocket::readyRead() 函数来判定是否有数据传输,激活槽函数输出数据。
7.TCP 数据的传输,
TCP 客户端的规则:
1.首先要规划号,连接的界面,ui->图片
2.类里面添加成员 QTcpSocket *m_tcp;//TCP 成员
8. 构造函数的初始化数据
- m_tcp = new QTcpSocket(this);
- connect(m_tcp,&QTcpSocket::connected,this,&Widget::connect_slot);//连接成功,显示提示信息
- connect(m_tcp,&QTcpSocket::readyRead,this,&Widget::readdata);//当有readyRead信号时,客户端即可接收服务器数据。
- //PushButton 是直接在ui设计界面定义槽函数,没有在这里使用 connect 连接
9.客户端的所有代码:
widget.h
- #ifndef WIDGET_H
- #define WIDGET_H
-
- #include
- #include
-
- namespace Ui {
- class Widget;
- }
-
- class Widget : public QWidget
- {
- Q_OBJECT
-
- public:
- explicit Widget(QWidget *parent = 0);
- ~Widget();
-
- private slots:
- void on_connect_clicked();
- void connect_slot();
- void readdata();
-
- void on_disconnect_clicked();
-
- void on_send_clicked();
-
- private:
- Ui::Widget *ui;
- QTcpSocket *m_tcp;
- };
-
- #endif // WIDGET_H
main.cpp
- #include "widget.h"
- #include
-
- int main(int argc, char *argv[])
- {
- QApplication a(argc, argv);
- Widget w;
- w.show();
-
- return a.exec();
- }
widget.cpp
- #include "widget.h"
- #include "ui_widget.h"
- #include <QHostAddress>
-
- //1.创建TCP套接字对象
- //2.连接服务器
- //3.和服务器进行通讯
- //4.断开连接。
-
- Widget::Widget(QWidget *parent) :
- QWidget(parent),
- ui(new Ui::Widget)
- {
- ui->setupUi(this);
- //1.创建TCP套接字对象
- m_tcp = new QTcpSocket(this);
- connect(m_tcp,&QTcpSocket::connected,this,&Widget::connect_slot);//连接成功,显示提示信息
- connect(m_tcp,&QTcpSocket::readyRead,this,&Widget::readdata);//当有readyRead信号时,客户端即可接收服务器数据。
- }
-
- Widget::~Widget()
- {
- delete ui;
- }
- //2.连接服务器
- void Widget::on_connect_clicked()
- {
- QString ip = ui->ip->text();//IP
- unsigned short port = ui->port->text().toShort();//端口
- m_tcp->connectToHost(QHostAddress(ip),port);//客户端连接服务器
- ui->connect->setEnabled(false);//连接按钮失能 //就是这是由连接按钮是否还能被使用,命令使用过后,这个按键不能被使用了
- ui->disconnect->setEnabled(true);//断开按钮使能 //就是这是由断开按钮是否还能被使用,命令使用过后,这个按键能使用了
- ui->textBrowser->append("已经连接服务器ip:"+ip);
- }
-
- void Widget::connect_slot()
- {
- ui->textBrowser->append("连接上服务器了");
- }
-
- void Widget::readdata()
- {
- QString data = m_tcp->readAll();
- ui->textBrowser->append(QString("服务器说:") + data);
- }
-
- void Widget::on_disconnect_clicked()
- {
- ui->textBrowser->append(QString("断开服务器了。。。"));
- m_tcp->close();
- ui->connect->setEnabled(true); //就是这是由连接按钮是否还能被使用,命令使用过后,这个按键能使用了
- ui->disconnect->setEnabled(false);//就是这是由断开按钮是否还能被使用,命令使用过后,这个按键不能使用了 。
- }
-
- void Widget::on_send_clicked()
- {
- QString data = ui->textEdit->toPlainText();
- m_tcp->write(data.toUtf8());//客户端向服务器发送数据
- ui->textBrowser->append(QString("客户端说:") + data);//显示记录
- ui->textEdit->clear();//清空发送文本框。
- }
10.TCP服务器的数据传输。
1.首先做好界面 ,ui -> 图片
2.做好类里面的成员对象的定义
头文件
#include
#include
成员:
QTcpServer *m_sever;//TCP服务器
QTcpSocket *m_tcp;//TCP的套接字
ui - >图片:
11.TCP服务器的所有代码:
widget.h
- #ifndef WIDGET_H
- #define WIDGET_H
-
- #include
- #include
- #include
-
- namespace Ui {
- class Widget;
- }
-
- class Widget : public QWidget
- {
- Q_OBJECT
-
- public:
- explicit Widget(QWidget *parent = 0);
- ~Widget();
-
- private slots:
- void on_pushButton_clicked();
- void newclient();
- void readdata();
-
- void on_pushButton_2_clicked();
- void clientdisconnect();
-
- private:
- Ui::Widget *ui;
- QTcpServer *m_sever;//TCP服务器
- QTcpSocket *m_tcp;//TCP的套接字
- };
-
- #endif // WIDGET_H
main.cpp
- #include "widget.h"
- #include
-
- int main(int argc, char *argv[])
- {
- QApplication a(argc, argv);
- Widget w;
- w.show();
-
- return a.exec();
- }
widget.cpp
- #include "widget.h"
- #include "ui_widget.h"
- #include<QDebug>
-
- Widget::Widget(QWidget *parent) :
- QWidget(parent),
- ui(new Ui::Widget)
- {
- ui->setupUi(this);
- //第一步,创建TCP服务器m_server对象
- m_sever = new QTcpServer(this);
- }
-
- Widget::~Widget()
- {
- delete ui;
- }
-
- void Widget::on_pushButton_clicked()
- {
- qDebug()<<"运行了 服务器的监听";
- //第二步:设置服务器监听
- //port保存要监听的端口
- unsigned short port = ui->lineEdit->text().toShort();
- //监听本电脑的所有ip地址和port端口。
- m_sever->listen(QHostAddress::Any,port);
-
- //第三步:响应客户端的连接
- connect(m_sever,&QTcpServer::newConnection,this,&Widget::newclient);
- }
-
- void Widget::newclient()
- {
- //第四步:通过nextpendingconnection函数,获取服务端的socket对象。
- ui->textBrowser->append("客户端连接上了...");
- //m_tcp是服务器m_sever的子对象,当tcpsever对象被销毁的时候,它也会自动销毁。
- //但最好显示删除,避免浪费内存。注意无法从另一个线程使用返回的QTcpSocket对象。
- //如果希望使用来自另一个线程的传入连接,需要重写incoming connection()。
- m_tcp = m_sever->nextPendingConnection();
-
- //第五步:数据的接收
- connect(m_tcp,&QTcpSocket::readyRead,this,&Widget::readdata);
- connect(m_tcp,&QTcpSocket::disconnected,this,&Widget::clientdisconnect);
- }
-
- void Widget::readdata()
- {
- QString temp = m_tcp->readAll();//服务器套接字m_tcp接收的所有数据。
- if(!temp.isEmpty())
- {
- ui->textBrowser->append("客户端说:"+temp);
- }
- }
-
- void Widget::on_pushButton_2_clicked()
- {
- //发送数据
- QString sendmsg = ui->textEdit->toPlainText();
- //服务器的套接字m_tcp发送数据。
- m_tcp->write(sendmsg.toUtf8());
- if(!sendmsg.isEmpty())
- {
- ui->textBrowser->append("服务器说:"+sendmsg);
- }
- //清空“发送数据框”
- ui->textEdit->clear();
- }
-
- void Widget::clientdisconnect()
- {
- //客户端断开了连接
- ui->textBrowser->append("客户端断开了连接....");
- //套接字m_tcp关闭
- m_tcp->close();
- }
12.PushButton 怎么在ui 设计界面 设置槽函数!
1.找到 PushButton 按键 右键 选择 转到槽
2.选择的函数:
13.ui 界面设置槽函数 在代码里面 槽函数的定义规则:
查看QT帮助手册、编译生成该文件的原因是 文件中有该函数
[static] void QMetaObject::connectSlotsByName(QObject *object)
给出的说明:递归搜索给定对象的所有子对象,并将来自这些子对象的匹配信号连接到以下形式的对象插槽:
void on__();
假设我们的对象有一个类型为QPushButton的子对象,对象名为button1。捕捉按钮的clicked()信号的槽是:
void on_button1_clicked();
如果对象本身具有正确设置的对象名称,则其自身的信号也将连接到其各自的插槽。
综上所述,只要槽函数名规则是这样的:on_子对象名_信号名.