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网络编程总结 一.概述 计算机网络是通过传输介质.通信设施和网络通信协议,把分散在不同地点的计算机设备互连起来,实现资源共享和数据传输的系统.网络编程就就是编写程序使联网的两个(或多个)设备( ...
随机推荐
- 用VLC做流媒体服务器
VLC确切来说只是个播放器,是videolan的开源产品,videolan原来还有一个VLM,是服务器端,专门用来做流媒体服务器的,但是现在VLM的功能已经都集成进VLC了,所以也就可以用VLC来做流 ...
- android开发 如何通过web服务器访问MYSQL数据库并且使其数据同步到android SQLite数据库?
通过web服务器访问MYSQL数据库有以下几个过程: 1.在MySql下创建自己的数据库和自己的表单 2.连接数据库. 3.访问数据库 1.创建web工程 (服务器端) 在Myeclipse下新建一个 ...
- 快速排序的JavaScript实现
思想 分治的思想,将原始数组分为较小的数组(但没有像归并排序一样将它们分隔开). 主元选择: 从数组中任意选择一项作为主元,通常为数组的第一项,即arr[i]:或数组的中间项, arr[Math.fl ...
- loadrunner的四个主要部件
1.VUser Generator :性能脚本开发 2.Controller :提供多线程并发操作 3.Analysis :结果分析 4.Load Generator :负载生成器 ***负载生成器完 ...
- js函数篇
1.闭包函数,作用:不污染全局变量, 定义:与外界隔离的独立作用域被称为闭包,使用函数实现该功能称为函数闭包: 写法: (function(){ function sayHello(){ conso ...
- arm-linux-3.4.2移植for2440
----------------------------2440 上内核3.4.2移植------------------------ PS:因wifi项目中无wifi驱动,需新内核. 1.首先在内核 ...
- Rreplication 性能差(转储200万门诊处方zjysb012)
ETLDB性能差(HIS转储200万门诊处方zjysb012) 解决方法: 1.禁用cdc.Hismz_capture 2.停止cdc.Hismz_capture 3.关闭zjysb012,zjysb ...
- 【转】GitHub使用
1.设置Git全局用户配置 git config --global user.name "xxx" git config --global user.email xxx@gmail ...
- Java探索之旅(17)——多线程(1)
1.多线程 1.1线程 线程是程序运行的基本执行单元.指的是一段相对独立的代码,执行指定的计算或操作.多操作系统执行一个程序时会在系统中建立一个进程,而在这个进程中,必须至少建立一个线程(这个线程被 ...
- adroid 分辨率适配
(1)drawable-hdpi里面存放高分辨率的图片,如WVGA (480x800),FWVGA (480x854) (2)drawable-mdpi里面存放中等分辨率的图片,如HVGA (320x ...