QT网络编程UDP下C/S架构广播通信

QT有封装好的UDP协议的类,QUdpSocket,里面有我们想要的函数接口。感兴趣的话,可以看看。

先搞服务端吧,写一个子类,继承QDialog类,起名为UdpServer类。头文件要引用我们上边说的QUdpSocket这个类,还有我们想要的布局的类。

 1 #ifndef UDPSERVER_H
 2 #define UDPSERVER_H
 3
 4 #include <QDialog>
 5 #include <QLabel>
 6 #include <QLineEdit>
 7 #include <QPushButton>
 8 #include <QVBoxLayout>
 9 #include <QtNetwork/QUdpSocket>
10 #include <QtNetwork/QHostAddress>
11 #include <QTimer>
12 class UdpServer : public QDialog
13 {
14     Q_OBJECT
15 public:
16     UdpServer(QWidget *parent = 0,Qt::WindowFlags f= 0);
17     ~UdpServer();
18 private:
19     QLabel * TimerLabel;
20     QLineEdit * TextLineEdit;
21     QPushButton* StartBtn;
22     QVBoxLayout * mainLayout;
23  public slots:
24     void StartBtnClicked();
25     void timeout();
26  private:
27     int port;
28     bool isStarted;
29     QUdpSocket * udpSocket;
30     QTimer *timer;
31 };
32 #endif // UDPSERVER_H

在.cpp文件里,我们先是把界面显示出来,然后用udp的writedategram把想要传的写进去。

 1 #include "udpserver.h"
 2
 3
 4 UdpServer::UdpServer(QWidget *parent,Qt::WindowFlags f)
 5     : QDialog(parent,f)
 6 {
 7    setWindowTitle(tr("UDP SERVER"));
 8    TimerLabel = new QLabel(tr("show time:"),this);
 9    TextLineEdit = new QLineEdit(this);
10    StartBtn = new QPushButton(tr("start"),this);
11
12    mainLayout = new QVBoxLayout(this);
13    mainLayout-> addWidget(TimerLabel);
14    mainLayout-> addWidget(TextLineEdit);
15    mainLayout-> addWidget(StartBtn);
16
17    connect(StartBtn,SIGNAL(clicked()),this,SLOT(StartBtnClicked()));
18    port = 5555;
19    isStarted = false;
20    udpSocket = new QUdpSocket(this);
21    timer = new QTimer(this);
22    connect(timer,SIGNAL(timeout()),this,SLOT(timeout()));
23
24 }
25
26 UdpServer::~UdpServer()
27 {
28
29 }
30 void UdpServer::StartBtnClicked()
31 {
32    if(!isStarted)
33    {
34       StartBtn->setText(tr("STOP"));
35       timer->start(1000);
36       isStarted = true;
37    }
38     else
39    {
40        StartBtn->setText(tr("BEGIN"));
41        isStarted = false;
42        timer->stop();
43    }
44 }
45 void UdpServer::timeout()
46 {
47     QString msg = TextLineEdit->text();
48     int length=0;
49     if(msg=="")
50     {
51        return;
52     }
53
54     if((length=udpSocket->writeDatagram(msg.toLatin1(),msg.length(),QHostAddress::Broadcast,port))!=msg.length())
55     {
56         qDebug() << msg.toLatin1();
57         return;
58     }
59 }

我这里用qDebug把要传的东西打印出来,进行测试,看看是否传过去了。

客户端:

 1 #ifndef UDPCLIENT_H
 2 #define UDPCLIENT_H
 3 #include <QDialog>
 4 #include <QVBoxLayout>
 5 #include <QTextEdit>
 6 #include <QPushButton>
 7 #include <QtNetwork/QUdpSocket>
 8  class UdpClient : public QDialog
 9 {
10     Q_OBJECT
11  public:
12     UdpClient(QWidget *parent = 0);
13     ~UdpClient();
14  private:
15     QTextEdit* ReceiceTextEdit;
16     QPushButton* CloseBtn;
17     QVBoxLayout* mainLayout;
18  public slots:
19     void CloseBtnClicked();
20     void dataReceived();
21  private:
22     int port;
23     QUdpSocket* udpSocket;
24 };
25 #endif // UDPCLIENT_H

客户端很简单,怎么实现布局,我就不多说了,主要是dataReceive函数。

 1 #include "udpclient.h"
 2 #include <QMessageBox>
 3 #include <QHostAddress>
 4
 5
 6 UdpClient::UdpClient(QWidget *parent)
 7     :QDialog(parent)
 8 {
 9   setWindowTitle("UDP CLIENT");
10
11   ReceiceTextEdit = new QTextEdit(this);
12   CloseBtn = new QPushButton(tr("Close"),this);
13
14   mainLayout  = new QVBoxLayout(this);
15   mainLayout->addWidget(ReceiceTextEdit);
16   mainLayout->addWidget(CloseBtn);
17
18   connect(CloseBtn,SIGNAL(clicked()),this,SLOT(CloseBtnClicked()));
19
20   port =5555;
21
22   udpSocket = new QUdpSocket(this);
23
24   bool result = udpSocket->bind(port);
25
26   if(!result)
27   {
28      QMessageBox::information(this,tr("ERROR"),tr("connect error"));
29      return;
30   }
31   connect(udpSocket,SIGNAL(readyRead()),this,SLOT(dataReceived()));
32
33 }
34  UdpClient:: ~UdpClient()
35 {
36
37
38 }
39 void UdpClient::CloseBtnClicked()
40 {
41    close();
42 }
43 void UdpClient::dataReceived()
44 {
45     while(udpSocket->hasPendingDatagrams())
46     {
47
48         QByteArray datagram;
49         datagram.resize(udpSocket->pendingDatagramSize());
50         udpSocket->readDatagram(datagram.data(),datagram.size());
51         QString msg=datagram.data();
52         ReceiceTextEdit->insertPlainText(msg);
53
54     }
55 }

最后显示一下界面,服务端发送hello。

客户端收到的:

不停的在打印hello。直到点击关闭,或者服务端停止。

时间: 2024-10-13 15:34:00

QT网络编程UDP下C/S架构广播通信的相关文章

QT网络编程Tcp下C/S架构的即时通信

先写一个客户端,实现简单的,能加入聊天,以及加入服务器的界面. #ifndef TCPCLIENT_H #define TCPCLIENT_H #include <QDialog> #include <QListWidget> #include <QLineEdit> #include <QPushButton> #include <QLabel> #include <QGridLayout> #include <QtNetWo

黑马程序员 网络编程 UDP与TCP

---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ----------------------/* 网络编程分为两种模式:TCP和UDP 连接互联网的计算机以亿计,为了唯一的标识出每台电脑,互联网就给每台电脑分配一个 唯一独立的ip地址,通过这个ip地址就可以进行计算机之间的数据交换 我们计算机交换的数据功能我们在java中把它封住成一个叫Socket的类, 简称套接字, 端口号:计算机数据的交换一般都是电脑上的程序来维护的,而电脑上又运

网络编程UDP Demo

package 网络编程UDP; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; public class UDPClient { public static void main(String[] args) { DatagramSocket ds = null; try { // 创建客户端的

网络编程UDP Demo1

!!!这是循环打印的输入的内容,如果要循环输入的话,一定要记得切换线程来输入,要不不管用的 package 网络编程UDP; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; public class UDPClient { public static void main(String[] arg

c/c++ 网络编程 UDP 发送端 bind 作用

网络编程 UDP 发送端 bind 作用 upd 发送端 调用bind函数的效果:把socket特定到一个指定的端口,如果不调用bind,内核会随机分配一个端口. upd 发送端 调用bind函数的目的:假如有2个发送端,接收端需要识别是从哪个发送端过来的,就可以分别在发送端调用bind函数,这样一来,接收端就能够知道是哪个发送端过来的数据了. 运行方法:先运行[1,先接收再发送],再运行[2,先发送再接收] 1,先接收再发送: #include <stdio.h> #include <

c/c++ 网络编程 UDP 改变网卡的硬件地址

网络编程 UDP 改变网卡的硬件地址 在程序里动态改变网卡的硬件地址 1,取得网卡的硬件地址 #include <stdio.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/ioctl.h> #include <netinet/in.h> #include <

c/c++ 网络编程 UDP 改变网关和网卡名字

网络编程 UDP 改变网关和网卡名字 在程序里动态改变网关和网卡名字 1,改变网卡名字 #include <stdio.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/ioctl.h> #include <netinet/in.h> #include <net

c/c++ 网络编程 UDP 改变IP地址

网络编程 UDP 改变IP地址 在程序里动态改变主机的IP地址 1,改变ipv4的地址 #include <stdio.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/ioctl.h> #include <netinet/in.h> #include <net

windows下QT前台和linux下后台程序通过socket通信

通常情况下,linux下的后台程序不需要GUI进行展示,而前台程序往往有个界面,方便和用户的交互.本文所演示的例 子,是QT 程序和后台linux进程(C语言)交互,通过socket传输的内容是结构体.因为QT本身是跨平台的框架,因此以后前端程序移植到其它平台依然能很好 的运行. 结构体的定义如下: struct Test              {                      int a;                      char b;              };