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之后再来研究研究怎么打包程序,最近晚上的空闲时间多了,闲着也 ...
随机推荐
- WinPE基础知识之头部
1.DOS头 // DOS MZ头,大小为64个字节 typedef struct _IMAGE_DOS_HEADER { WORD e_magic; // EXE标志,“MZ”(有用,解析时作为是否 ...
- 7.SpringMVC 配置式开发-ModelAndView和视图解析器
ModelAndView 1.Model(模型) 1.model的本质就是HashMap,向模型中添加数据,就是往HashMap中去添加数据 2.HashMap 是一个单向查找数组,单向链表数组 3. ...
- CHD-5.3.6集群上hive安装
解压过后: [hadoop@master CDH5.3.6]$ ls -rlttotal 8drwxr-xr-x. 17 hadoop hadoop 4096 Jun 2 16:07 hadoop- ...
- TCP-HTTP ___UDP 应用场景
UDP 套接字应用之广播 import socket,threading #创建套接字 s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # 设置套接 ...
- 小程序Flex布局
容器属性 容器支持的属性有:display:通过设置display属性,指定元素是否为Flex布局.flex-direction:指定主轴方向,决定了项目的排列方式.flex-wrap:排列换行设置. ...
- php连接oracle oracle开启扩展
<?php /** * 由于公司的需要,使用php+oracle开发项目,oracle因为有专门人员开发设计,我们只需远程调用 *于是乎遇到了蛋疼的问题就是开启oracle扩展的问题,虽然你在p ...
- python改成了python3的版本,那么这时候yum就出问题了
既然把默认python改成了python3的版本,那么这时候yum就出问题了,因为yum貌似不支持python3,开发了这个命令的老哥也不打算继续写支持python3的版本了,所以,如果和python ...
- struts2之关联查询(5)
需要关联四个表 select g.*,b.name brname,s.bid,s.sname,bi.name biname from T_GOODS g left join T_brand b on ...
- Unity 截图选择框,中间全透明,边缘半透明
效果:点击白色框可拖拽选择区域 代码: using System.Collections; using System.Collections.Generic; using UnityEngine; u ...
- 【git】git中使用https和ssh协议的区别以及它们的用法
git可以使用四种主要的协议来传输资料: 本地协议(Local),HTTP 协议,SSH(Secure Shell)协议及 git 协议.其中,本地协议由于目前大都是进行远程开发和共享代码所以一般不常 ...