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学习之网络编程(二)的更多相关文章

  1. Qt学习之网络编程(一)

    一些说明 学了有一段时间的python了,小项目做了不少,最近由于项目需要,所以要回归老本行了,开始重点突击C++和qt.python的网络爬虫系列有时间就更吧. 获取本机网络信息 在网络应用中,经常 ...

  2. Qt 多线程和网络编程学习

    一,Qt多线程类学习 QThread类,开始一个新的线程就是开始执行重新实现QThread::run(),run()是默认现实调用exec(),QThread::start()开始线程的执行,run( ...

  3. VC++学习之网络编程中的套接字

    VC++学习之网络编程中的套接字 套接字,简单的说就是通信双方的一种约定,用套接字中的相关函数来完成通信过程.应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问 ...

  4. Linux网络编程(二)

    Linux网络编程(二) 使用多进程实现服务器并发访问. 采用多进程的方式实现服务器的并发访问的经典范例. 程序实现功能: 1.客户端从标准输入读入一行文字,发送到服务器. 2.服务器接收到客户端发来 ...

  5. 5、QT分析之网络编程

    原文地址:http://blog.163.com/net_worm/blog/static/127702419201002842553382/ 首先对Windows下的网络编程总结一下: 如果是服务器 ...

  6. java基础学习总结——网络编程

    一.网络基础概念 首先理清一个概念:网络编程 != 网站编程,网络编程现在一般称为TCP/IP编程.

  7. QT分析之网络编程

    原文地址:http://blog.163.com/net_worm/blog/static/127702419201002842553382/ 首先对Windows下的网络编程总结一下: 如果是服务器 ...

  8. 深入学习socket网络编程,以java语言为例

    了解java的socket编程与Linux Socket API之间的关系 一.java的网络编程 1.socket原理 socket通信就是通过IP和端口号将两台主机建立连接,提供通信.主机A的应用 ...

  9. Java学习:网络编程总结

    Java网络编程总结 一.概述 计算机网络是通过传输介质.通信设施和网络通信协议,把分散在不同地点的计算机设备互连起来,实现资源共享和数据传输的系统.网络编程就就是编写程序使联网的两个(或多个)设备( ...

随机推荐

  1. Mybatis学习--动态SQL

    学习笔记,选自Mybatis官方中文文档:http://www.mybatis.org/mybatis-3/zh/dynamic-sql.html MyBatis 的强大特性之一便是它的动态 SQL. ...

  2. ONTAK2010 Peaks加强版

    给一个图,每个点有点权,$q$ 次询问从 $x$ 开始只走点权小于等于 $y$ 的路径能到的点中第 $k$ 大的点权,无解输出 -1 强制在线 请注意因为这个 sb 博主为了描述方便,这里的题目描述用 ...

  3. TYVJ 1094 矩形分割

    时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 YHOI Train#4 Problem 1 描述 出于某些方面的需求,我们要把一块N×M的木板切成一个个1× ...

  4. Java数组的基本讲解

    由于Java数组涵盖的内容比较多,这里从个人的角度对主要的内容进行相关的讲解. 如有不足,欢迎批评指正~ 1)Java数组是动态还是静态的啊?     Java语言是典型的静态语言,由此推断Java数 ...

  5. nginx做代理部署WordPress

    实验环境:CentOS7 服务器172.16.252.142做Nginx代理服务器: [root@conf.d localhost]#iptables -F [root@conf.d localhos ...

  6. IIS备份和还原

    当我们电脑系统有大量的站点和虚拟目录的时候,电脑因为种种原因需要重做系统,那么重装系统后这些站点我们是否只能一个一个的添加,如果有成百上千个站点呢,任务量可想而知,本文将介绍如何备份和还原window ...

  7. ORM查询相关

    一.多对多的正反向查询 class Class(models.Model): name = models.CharField(max_length=32,verbose_name="班级名& ...

  8. WCF服务用户名密码访问

    有2种方式, 第一直接在程序中指定用户名密码,配置调用 private void BtnSearch_Click(object sender, EventArgs e) { try { var cli ...

  9. 安装 ambaria

    hadoop安装 wget http://public-repo-1.hortonworks.com/ambari/centos6/1.x/updates/1.2.4.9/ambari.repo cp ...

  10. C++中的构造函数小结

    对象的初始化 对象时类的实例,类是不占用空间的,对象是占用空间的. 因为类是抽象的,不占用空间的,所以我们不能再定义类的时候对对象进行初始化操作的. 但是,我们可以定义一个函数,在类实例化一个对象的时 ...