qt5之网络通信
QT5 TCP网络通讯
- 服务器与客户端建立连接listen() - connectToHost(); 触发newPendingConnect信号
- 实时数据通讯write(); read(); 触发readyRead信号
- 通讯主要使用的类:
QTcpServer Class
QTcpServer类提供了一个基于TCP的服务器。
这个类可以接受传入的TCP连接。您可以指定端口或让QTcpServer自动选择一个端口。您可以收听特定地址或所有机器的地址。
调用listen()让服务器侦听传入的连接。每次客户端连接到服务器时,都会发出newConnection()信号。QTcpSocket Class
QTcpSocket类提供了一个TCP套接字。
TCP(传输控制协议)是一种可靠的,面向流的,面向连接的传输协议。 它特别适合连续传输数据。
QTcpSocket是QAbstractSocket的一个方便的子类,它允许你建立一个TCP连接并传输数据流。建立连接:
服务器端以监听的方式监听客服端是否有连接请求
客户端以调用connectToHost()函数主动连接服务器端
tcp协议服务器端实现流程
建立服务器对象
listen服务器, 通过建立的服务器 监听指定地址/端口的客服端;判断是否有客户连接有连接就触发newConnection();
- 通过connect处理newConnection()信号;
server = new QTcpServer(this); //建立一个服务器对象
server->listen(QHostAddress::Any, );//通过建立的服务器监听指定ip地址及端口号的客服端,如不指定端口号,系统会随机分配
connect(server, QTcpServer::newConnection,
[=]()
{
qDebug() << "有连接进来";
}
);tcp协议客户端实现流程
建立QTcpSocket套节字(ip,端口)
通过套节字connectToHost()函数主动连接服务器;连接成功则触发服务器QTcpServer::newConnection信号;并发送套节字到服务器端;
关闭连接;
QTcpSocket Sc(this);
Sc.connectToHost("127.0.0.1", );//实际代码中参数要进行类型转化
Sc.close();实时通讯:
- 客户端到服务器端通讯
- 当客户端与服务器端建立连接后;
- 客户端与服务器端通讯在客户端通过套节字对象调用write()函数发送上传内容;
- 服务器端有客户端数据写入时服务器端会自动调用readyread信号
- 服务器端在connect中处理readyread信号,并由nextPendingConnection()函数接收客户端发送的套节字;
- 服务器端对接收的套节字进行相应处理,即完成一次客户端到服务器端的通讯
- 服务器端到客户端的通讯
- 当客户端与服务器端建立连接后;
- 服务器通过套节字对象调用write()函数发送上传内容;客户端会触发readyread信号
- 客户端在connect中处理readyread信号
客户端到服务器端实现代码:
- 服务器端头文件widget.h
#ifndef WIDGET_H
#define WIDGET_H #include <QWidget>
#include <QTcpServer>
#include <QTcpSocket>
namespace Ui {
class Widget;
} class Widget : public QWidget
{
Q_OBJECT public:
explicit Widget(QWidget *parent = );
~Widget(); private slots:
void on_buttonsend_clicked(); private:
Ui::Widget *ui; QTcpServer *server; //建立服务器对象
QTcpSocket *socket; //套节字对象
QByteArray tp; //
}; #endif // WIDGET_H服务器端cpp文件 widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QDebug> Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
setWindowTitle("服务器");
tp = nullptr; server = new QTcpServer(this);
server->listen(QHostAddress::Any, );
connect(server, QTcpServer::newConnection,
[=]()
{
socket = server->nextPendingConnection();
connect(socket, &QTcpSocket::readyRead, [=]()
{
tp = socket->readAll();
ui->testdis->append(tp);
});
}
); } Widget::~Widget()
{
delete ui;
} void Widget::on_buttonsend_clicked()
{
socket->write(ui->textEdit->toPlainText().toUtf8());
}客户端头文件socket.h:
#ifndef SOCKET_H
#define SOCKET_H #include <QWidget>
#include <QTcpSocket>
#include <QHostAddress> namespace Ui {
class socket;
} class socket : public QWidget
{
Q_OBJECT public:
explicit socket(QWidget *parent = );
~socket(); private slots: void on_buttonLink_clicked(); void on_buttonsend_clicked(); void on_serverclose_clicked(); private:
Ui::socket *ui; QTcpSocket *sock;
QHostAddress adrs;
quint16 port;
}; #endif // SOCKET_H客户端cpp文件socket.cpp
#include "socket.h"
#include "ui_socket.h" socket::socket(QWidget *parent) :
QWidget(parent),
ui(new Ui::socket)
{
ui->setupUi(this);
sock = new QTcpSocket(this);
setWindowTitle("张三");
connect(sock, &QTcpSocket::readyRead,
[=]()
{
ui->textdis->append(sock->readAll());
});
} socket::~socket()
{
delete ui;
} void socket::on_buttonLink_clicked()
{
QString ip = ui->serverIP->text();
QString p = ui->serverPort->text();
sock->connectToHost(ip, p.toUShort());
} void socket::on_buttonsend_clicked()
{
QString temp = ui->textEdit->toPlainText();
if(!temp.isEmpty())sock->write(temp.toUtf8());
} void socket::on_serverclose_clicked()
{
sock->close();
}main.cpp文件
#include "widget.h"
#include <QApplication>
#include "socket.h" int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
socket w1;
w1.show(); return a.exec();
}运行的效果如图所示
后续的通信例子还在学习中,本文的参考链接:
(1)https://www.cnblogs.com/flowingwind/p/8348519.html
- (2)https://www.cnblogs.com/findumars/p/5838531.html
- (3)https://blog.csdn.net/pk124729136/article/details/8087609
qt5之网络通信的更多相关文章
- 分享基于Qt5开发的一款故障波形模拟软件
背景介绍 这是一款采用Qt5编写的用于生成故障模拟波形的软件.生成的波形数据用于下发到终端机器生成对应的故障类型,用于培训相关设备维护人员的故障排查技能.因此,在这款软件中实现了故障方案管理.故障波形 ...
- Qt5.7学习
一 Qt简介(Build your world with Qt) 二 Qt5.7.0的安装 三 Qt系统构造库及常用类 四 信号(signal)与槽(slot)通信机制 五 QtDesigner开发工 ...
- QT5:介绍
一.简介 QT是一个跨平台的C++开发库,主要用来开发图形用户界面(Graphical User Interface,GUI) QT除了可以绘制漂亮的界面(包括控件/布局/交互),还可以多线程/访问数 ...
- QT5利用chromium内核与HTML页面交互
在QT5.4之前,做QT开发浏览器只能选择QWebkit,但是有过使用的都会发现,这个webkit不是出奇的慢,简直是慢的令人发指,Release模式下还行,debug下你就无语了,但是webkit毕 ...
- qt5中信号和槽的新语法
qt5中的连接 有下列几种方式可以连接到信号上 旧语法 qt5将继续支持旧的语法去连接,在QObject对象上定义信号和槽函数,及任何继承QObjec的对象(包含QWidget). connect(s ...
- Ubuntu在wps-office等qt5程序下不能切换中文fcitx输入法的问题
经检查,是缺了fcitx-qt的包.比如qt5的程序,需要一个叫fcitx-libs-qt5的包. 如果您在基于qt的程序下不能使用基于fcitx的中文输入法,请检查以下包是否已安装: sudo ap ...
- qt5中文代码编码编译问题
qt中文代码用vs2010编译问题解决 总结说就是qt5默认UTF8不支持微软默认的ANSI(GB2312/GBK).解决办法是把中文字符串全部用 QString::fromLocal8Bit() 封 ...
- VS2010+Qt5.4.0 环境搭建(离线安装)
原创作者:http://blog.csdn.net/solomon1558/article/details/44084969 前言 因项目需要Qt开发GUI,我根据网上资料及自己的经验整理了搭建vs2 ...
- qt5.5程序打包发布以及依赖【转】
玩qt5也有一段时间了,惭愧的是一直没有好好的发布过程序,因为写的都是小程序没啥需要用到发布,而且qt也说不上很熟悉,本来打算到基本掌握qt之后再来研究研究怎么打包程序,最近晚上的空闲时间多了,闲着也 ...
随机推荐
- ESP8266 UDP通信
#include "driver/uart.h" #include "espconn.h" void ICACHE_FLASH_ATTR user_rf_pre ...
- Java虚拟机内存基础、垃圾收集算法及JVM优化
1 JVM 简单结构图 1.1 类加载子系统与方法区 类加载子系统负责从文件系统或者网络中加载 Class 信息,加载的类信息存放于一块称 为方法区的内存空间.除了类的信息外,方法区中可能还会存放 ...
- maskrcnn-benchmark训练自己数据
需要修改的地方 1. ./maskrcnn_benchmark/data/datasets/voc.py 将CLASSES 内容改为自己的数据标签 2. ./maskrcnn_benchmark/co ...
- STM32——CAN总线波特率和位时序详解
本人用的单片机是STM32F407,其它型号的单片机类似,可做参考! 一.标准CAN协议位时序概念 由于CAN属于异步通讯,没有时钟信号线,连接在同一个总线网络中的各个节点会像串口异步通讯那样,节点间 ...
- vue-element-admin后台的安装
# 克隆项目 git clone https://github.com/PanJiaChen/vue-element-admin.git # 进入项目目录 cd vue-element-admin # ...
- dao层取值用List<map<String,Object>>接收有序map
发现一个好玩的Map, 当需要Map有序时用java.util.LinkedHashMap接收,是有序map resultType="java.util.LinkedHashMap" ...
- idea 设置Terminal为git终端
- SpringMVC问题整理
JSP页面无法获取ModelAndView里的值 自己搭的项目突然EL表达式取不到值了 不管是用 ${msg} 还是用JSTL的<c:out value="${msg}"/& ...
- JavaScript教程——函数(arguments 对象)
arguments 对象 定义 由于 JavaScript 允许函数有不定数目的参数,所以需要一种机制,可以在函数体内部读取所有参数.这就是arguments对象的由来. arguments对象包含了 ...
- Redis持久化(三)
Redis持久化 Redis提供了哪些持久化机制 1. RDB持久化: 该机制是指在指定的时间间隔内将内存中的数据集快照写入磁盘. 2. AOF持久化: 该机制 ...