Qt学习之网络编程(二)
UDP协议
UDP协议(用户数据报协议)是一种简单轻量级、不可靠、面向数据报、无连接的传输层协议。之后我们会介绍TCP协议,相对于UDP,TCP是一种可靠的、有连接的协议;既然这样我们就用TCP不就好了?UDP一直沿用至今是有它的必要意义的,什么意义---UDP它快呀。在进行可靠性并不是需要那么搞得情况下,UDP绝对是首选,比如视频聊天就是UDP协议传输的额,所以有时会出现卡顿的情况,但实际上并不影响我们的使用。下面我们来实现它:

UDP Server
创建界面
定义好组件
#ifndef UDPSERVER_H
#define UDPSERVER_H
#include <QDialog>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QVBoxLayout>
class UdpServer : public QDialog
{
Q_OBJECT
public:
UdpServer(QWidget *parent = 0,Qt::WindowFlags f=0);
~UdpServer();
private:
QLabel *TimerLabel;
QLineEdit *TextLineEdit;
QPushButton *StartButton;
QVBoxLayout *mainLayout;
};
#endif // UDPSERVER_H
再在udpserver.cpp文件中将界面具体实现:
#include "udpserver.h"
UdpServer::UdpServer(QWidget *parent, Qt::WindowFlags f)
: QDialog(parent, f)
{
setWindowTitle(tr("UDP Server"));
TimerLabel = new QLabel(tr("计时器:"),this);
TextLineEdit = new QLineEdit(this);
StaratButton = new QPushButton(tr("开始"),this);
mainLayout = new QVBoxLayout(this);
mainLayout->addWidget(TimerLabel);
mainLayout->addWidget(TextLineEdit);
mainLayout->addWidget((StartButton));
}
UdpServer::~UdpServer()
{
}
与之前的代码中的QWidget不太相同,这里用的是QDialog,而且代码中QWidget(QWidget *parent=0,Qt::WindowFlags f=0)增加了Qt::WindowFlags。我在这先说一说区别,QWidget *parent=0是父窗口部件的指定,后面的新增组件只用利用this指针附着在上面就行了,如果没有this则会被父窗口遮挡。QT::WindowFlags=0是指定控件的窗口标识,值为0(Qt::Widget)。而窗口标识是由窗口类型和窗口提示hint,首先判断一个控件是否是窗体先根据参数parent的指定,要是值为0那么就可以判断其是一个窗口。否则需要根据Qt::WindowFlags枚举类型的值才可以判断其是否为窗口还是部件。由于Qt::WindowFlags为枚举类型,所以会将QWidget、QWindow、QDialog....组件或者窗口进行枚举,表示窗口或者组件的作用。
实现界面如下图:

功能实现
首先在udpserver.h中声明public slots,为StartButtonClicked()与timeout()两个方法;之后再在private中声明port、判断是否点击开始了的isStarteddebol变量、一个udp套接字、计时器timer。
然后我们需要在udpServer.cpp中完成StartButtonClicked()与timeout()两个函数。StartButtonClicked()比较简单,只是一个判断让按钮显示“开始”还是“停止”,并将是否点击开始了的isStarteddebol变量置为相应的参数,同时需要开始一个计时器如果timer->start(1000)即1000s过后就自动断开连接。
实现timeout(),之前的connect(..,SIGNAL(timeout()),..,SLOT(timeout()))函数是将信息timeout的数据进行绑定;如果输入的信息位空字符串,则直接返回。QHostAddress::Broadcast指定向广播地址发送,这里是向port发送数据。
UDP Client
同样是创建界面和功能实现两个部分,创建界面就一笔带过了,这里谈谈功能实现中关于套接字实现的这个地方。功能代码如下:
port = 5555;
udpSocket = new QUdpSocket(this);
connect(udpSocket,SIGNAL(readyRead()),this,SLOT(dataReceived()));
bool result = udpSocket->bind(port);
首先创建一个udp套接字,然后将套接字绑定在端口5555上,这样服务器端和客户端都有一个端口5555,则可以实现通信。而connect(udpSocket,SIGNAL(readyRead()),this,SLOT(dataReceived()));这句中,代表连接QIODevice的readyRead()信号。QUdpSocket也是一个I/O设备,从QIODevice继承而来,当有关数据到达I/O设备的时候,会发出readyRead()信号。
dataReceived()函数实现代码:
void UdpClient::dataReceived()
{
while(udpSocket->hasPendingDatagrams())
{
QByteArray datagram;
datagram.resize(udpSocket->pendingDatagramSize());
udpSocket->readDatagram(datagram.data(),datagram.size());
QString msg=datagram.data();
ReceiveTextEdit->insertPlainText(msg);
}
}
while(udpSocket->hasPendingDatagrams()),这句代码的意思是判断UdpSocket中是否有数据报可读,hasPendingDatagrams()方法在至少有一个数据报可读时返回true,否则返回false.最后一句 ReceiveTextEdit->insertPlainText(msg);的功能是显示代码,中间部分代码是读取第一个数据报。
最终效果图如下:



Qt学习之网络编程(二)的更多相关文章
- Qt学习之网络编程(一)
一些说明 学了有一段时间的python了,小项目做了不少,最近由于项目需要,所以要回归老本行了,开始重点突击C++和qt.python的网络爬虫系列有时间就更吧. 获取本机网络信息 在网络应用中,经常 ...
- Qt 多线程和网络编程学习
一,Qt多线程类学习 QThread类,开始一个新的线程就是开始执行重新实现QThread::run(),run()是默认现实调用exec(),QThread::start()开始线程的执行,run( ...
- VC++学习之网络编程中的套接字
VC++学习之网络编程中的套接字 套接字,简单的说就是通信双方的一种约定,用套接字中的相关函数来完成通信过程.应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问 ...
- Linux网络编程(二)
Linux网络编程(二) 使用多进程实现服务器并发访问. 采用多进程的方式实现服务器的并发访问的经典范例. 程序实现功能: 1.客户端从标准输入读入一行文字,发送到服务器. 2.服务器接收到客户端发来 ...
- 5、QT分析之网络编程
原文地址:http://blog.163.com/net_worm/blog/static/127702419201002842553382/ 首先对Windows下的网络编程总结一下: 如果是服务器 ...
- java基础学习总结——网络编程
一.网络基础概念 首先理清一个概念:网络编程 != 网站编程,网络编程现在一般称为TCP/IP编程.
- QT分析之网络编程
原文地址:http://blog.163.com/net_worm/blog/static/127702419201002842553382/ 首先对Windows下的网络编程总结一下: 如果是服务器 ...
- 深入学习socket网络编程,以java语言为例
了解java的socket编程与Linux Socket API之间的关系 一.java的网络编程 1.socket原理 socket通信就是通过IP和端口号将两台主机建立连接,提供通信.主机A的应用 ...
- Java学习:网络编程总结
Java网络编程总结 一.概述 计算机网络是通过传输介质.通信设施和网络通信协议,把分散在不同地点的计算机设备互连起来,实现资源共享和数据传输的系统.网络编程就就是编写程序使联网的两个(或多个)设备( ...
随机推荐
- 倍增模板orz
#include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #i ...
- 配置 VS Code 调试 PHP
配置 VS Code 调试 PHP 1.下载 xampp 集成服务器wampserver3.1.0-Apache2.4.7_PHP5.6.3-7.0.23-7.1.19_MySQL5.7.19_Mar ...
- bzoj 2535 & bzoj 2109 航空管制 —— 贪心+拓扑序
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2535 https://www.lydsy.com/JudgeOnline/problem.p ...
- bzoj 1001 狼抓兔子 —— 平面图最小割(最短路)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1001 平面图最小割可以转化成最短路问题: 建图时看清楚题目的 input ... 代码如下: ...
- Linux 系统通过 Squid 配置实现代理上网
本文转载自:https://help.aliyun.com/knowledge_detail/41342.html Squid 介绍 Squid 是一个缓存 Internet 数据的软件,其接收用户的 ...
- HDOJ5441(图论中的并查集)
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; ; ; ; ...
- python 接口测试字符类型转换
接口返回数据: print sql[0][10] {"recv_name":"rdgztest_63126","send_name":&qu ...
- 二 Akka学习 - actor介绍
一个actorSystem 是一个重量级的结构.它会分配N个线程.所以对于每一个应用来说只用创建一个ActorSystem. Actor是种可怜的“生物”,它们不能独自存活.Akka中的每一个Acto ...
- uboot 命令使用教程(uboot参数设置)
1. Printenv 打印环境变量. uboot> printenv baudrate=115200 ipaddr=192.168.0.111 ethaddr=32:34:46:78:9A:D ...
- makefile基本语法
多文件编程的小例子功能:在main.c里面调用其他两个源文件里面的函数,然后输出字符串. 1.main.c #include"mytool1.h"#include" ...