17173游戏网官网/手机端seo
一、Linux中的网络编程
1、子网和公网的概念
- 子网网络:局域网,只能进行内网的通信
- 公网网络:因特网,服务器等可以进行远程的通信
2、网络分层模型
4层模型:应用层、传输层、网络层、物理层
- 应用层:用户自定义的网络数据传输协议:ssh、tftp、tfp、http 等
- 传输层:tcp/udp出传输协议
- 网络层:IPV4/IPV6,3G,4G,5G等网络协议
- 物理层:光纤、路由器、网线、网卡
3、Tcp与Udp协议的区别
-
三次握手:第一次握手就是客户端给服务器端发送一个报文,第二次就是服务器收到报文之后,会应答一个报文给客户端,第三次握手就是客户端收到报文后再给服务器发送一个报文,三次握手就成功了。(进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常)
-
Tcp传输协议:可靠传输协议,Tcp需要三步握手连接,每次通信都会进行数据的校验
-
Tcp的应用:一般用于文件的传输、控制命令的传输
-
Udp传输协议:不可靠传输协议,Udp传输不需要建立连接,Udp不会进行数据校验
-
Udp的应用:一般用于多媒体的数据传传输:屏幕广播软件、视频网站、直播软件
二、TCP通信
1、QTcpSocket Class 客户端类
Header: #include 头文件
qmake: QT += network 模块
Inherits: QAbstractSocket 父类
Inherited By: QSctpSocket and QSslSocket 派生类
2、函数接口
构造函数:
QTcpSocket(QObject *parent = nullptr)
//链接服务器 IP+端口
connectToHost(const QHostAddress &, quint16, QIODevice::OpenMode )
QHostAddress : IP地址
quint16 : 端口号
------------------------------------------------------------------
//直接填写IP 地址即可链接
connectToHost(const QString &, quint16, QIODevice::OpenMode, QAbstractSocket::NetworkLayerProtocol )
例子:
socket->connectToHost("192.168.25.2",1000);
3、数据的收发
//数据的发送
write(const char *, qint64 ) //发送 qint64大的数据
write(const char *)//直接发送字符数据
write(const QByteArray &) //发生QByteArray类型的数据//数据的接收
qint64 read(char *, qint64 ) //读取 qint64大的数据到 char * 地址 上
QByteArray read(qint64 ) //读取 qint64 大的数据 并返回
QByteArray readAll() //读取所有数据
//关联可读信号
[signal] void QIODevice::readyRead()
4、QTcpServer Class 服务器类
Header: #include
qmake: QT += network
Inherits: QObject
Inherited By: QSctpServer
5、函数接口:
构造函数:
QTcpServer(QObject *parent = nullptr)
//绑定并监听接口
bool QTcpServer::listen(const QHostAddress &address = QHostAddress::Any, quint16 port= 0)
QHostAddress::Any : 相当于 INADDR_ANY.自动监听本地的所有地址
port : 取值范围 0 - 65535,尽量用 1000 以后的,因为 1000前,系统占用
例子: 监听本地IP地址
server->listen(QHostAddress::Any,6666)接收链接请求:
//服务器新的链接信号
[signal] void QTcpServer::newConnection()
//服务器 产生新的对象
[virtual] QTcpSocket*QTcpServer::nextPendingConnection()
6、数据的收发 :
//产生新的通信对象
QTcpSocket *new_socket = server->nextPendingConnection();
//通过的新的对象进行数据的收发
write(const char *, qint64 ) //发送 qint64大的数据
write(const char *)//直接发送字符数据
write(const QByteArray &) //发生QByteArray类型的数据
//接收数据
//1.关联新的对象的可读 信号
[signal] void QIODevice::readyRead()
//2.在槽函数中读取数据
qint64 read(char *, qint64 ) //读取qint64 大的数据到 char * 地址 上
QByteArray read(qint64 ) //读取 qint64大的数据 并返回
QByteArray readAll() //读取所有数据
练习:实现客户端与调试助手的双向通信
①、服务端:Server.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//1、创建一个服务器对象server = new QTcpServer(this);//2、开始监听if(server->listen(QHostAddress :: Any, 7777)){qDebug() << "监听成功" << endl;}else{qDebug() << "监听失败" << endl;}//3、关联新的链接信号connect(server, SIGNAL(newConnection()), this, SLOT(accept_connect()));
}MainWindow::~MainWindow()
{delete ui;
}int i=0;
QTcpSocket *new_socket ;void MainWindow :: accept_connect()
{qDebug() << "有新的链接请求处理" << endl;//产生新的通信对象new_socket = server->nextPendingConnection();//哪里产生对象,就哪里关联connect(new_socket, SIGNAL(readyRead()), this, SLOT(read_data()));
}//收到信息读取
void MainWindow :: read_data()
{QString msg = new_socket->readAll();//取出发送者的IP地址qDebug() << new_socket->peerAddress() << endl;qDebug() << msg <<endl;//显示收到信息ui->textBrowser->setText(msg);
}//发送信息给客户端
void MainWindow::on_pushButton_clicked()
{QString msg = ui->textEdit->toPlainText();new_socket->write(msg.toUtf8());
}
②、服务端:Client.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"QTcpSocket *socket;
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//1、创建客户端通信对象socket = new QTcpSocket(this);//2、链接服务器socket->connectToHost("192.168.124.54", 7777);//3、数据的发送socket->write("Hello ");//4、关联刻度信号connect(socket, SIGNAL(readyRead()), this, SLOT(read_date()));
}MainWindow::~MainWindow()
{delete ui;
}//读取信息
void MainWindow::read_date()
{QString msg = socket->readAll();//显示收到信息ui->textBrowser->setText(msg);
}//发送信息
void MainWindow::on_pushButton_clicked()
{QString msg = ui->textEdit->toPlainText();socket->write(msg.toUtf8());
}
三、UDP通信
1、QUdpSocket Class类
Header: #include 头文件
qmake: QT += network 模块
Inherits: QAbstractSocket 父类
2、函数接口:
构造函数:
QUdpSocket(QObject *parent = nullptr)
发送数据的接口:
qint64 writeDatagram(const char *data, qint64 size, const QHostAddress &address,quint16 port)
data:需要发送的数据
size:数据的大小
address:接收端的IP
port : 接收端的端口
qint64 writeDatagram(const QByteArray &datagram, const QHostAddress &host, quint16 port)
3、接收端:
1.绑定UDP socket
bool QAbstractSocket::bind(const QHostAddress &address, quint16 port = 0)
address:需要绑定的地址
port:需要绑定的端口2.读取数据
qint64 QUdpSocket::readDatagram(char *data, qint64 maxSize, QHostAddress *address =nullptr, quint16 *port = nullptr)
data:读取后数据的存放地址
maxSize:读取的数据最大值
address:发送者的IP
port:发生者的端口QNetworkDatagram QUdpSocket::receiveDatagram(qint64 maxSize = -1)
QNetworkDatagram 网络数据管理类
QHostAddress senderAddress() const //发送者的IP
int senderPort() const //发生者端口
int destinationPort() const 获取对方的端口
练习:
①、接收端:recv.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QNetworkDatagram>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//1、创建接收端socket = new QUdpSocket(this);//2、绑定if(socket->bind(QHostAddress::Any, 7777)){qDebug() << "绑定成功" << endl;}else{qDebug() << "绑定失败" << endl;}//3、关联可读信号connect(socket, SIGNAL(readyRead()), this, SLOT(readData()));
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::readData()
{qDebug() << "读取数据" << endl;//判断是否有网络数据while (socket->hasPendingDatagrams()){//把所有的数据读取到msgQNetworkDatagram msg = socket->receiveDatagram();//输出IP和Port信息qDebug() << msg.senderAddress().toString() << endl;qDebug() << msg.senderPort() << endl;//把发送端发送的数据转化为原来的QString类型数据QString decodeMsg = QString :: fromUtf8(msg.data());//输出数据qDebug() << decodeMsg << endl;}
}
②、发送端:send.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QString>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//1、创建发送端socket = new QUdpSocket(this);}MainWindow::~MainWindow()
{delete ui;
}//按键按下发送信息
void MainWindow::on_pushButton_clicked()
{//获取对话框信息QString msg = ui->lineEdit->text();//利用套接字发送信息socket->writeDatagram(ui->lineEdit->text().toUtf8(), QHostAddress("192.168.124.54"), 7777);
}
四、HTTP 请求
超文本传输协议(Hyper Text Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的信息以及得到什么样的响应
简单理解:客户通过http请求协议从服务器中获取需要的数据
免费API接口
http://api.qingyunke.com/ //机器人 api
舔狗API 官网
http://v2.alapi.cn
http://v2.alapi.cn/api/dog?
token=3ydsG67GrDABA97n(自己的token)
http://v2.alapi.cn/api/acg?
token=3ydsG67GrDABA97n(自己的token)
http://v2.alapi.cn/api/acg?
token=3ydsG67GrDABA97n(自己的token)
五、QT 中的HTTP 请求
1、QNetworkAccessManager Class网络请求管理器
Header: #include
qmake: QT += network
Since: Qt 4.4
Inherits: QObject
2、官方的请求 demo
//1.新建网络请求 管理器
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
//关联管理器的 finished 信号
connect(manager,&QNetworkAccessManager::finished,this, &MyClass::replyFinished);
//2.往http://qt-project.org 网站发起请求
manager->get(QNetworkRequest(QUrl("http://qtproject.org")));
网络请求信号:
void finished(QNetworkReply *reply)
3、QNetworkReply Class 网络请求数据管理器
Header: #include
qmake: QT += network
Since: Qt 4.4
Inherits: QIODevice
4、函数接口
//读取所有网络返回的数据
readAll()
//信号
void downloadProgress(qint64 bytesReceived,
qint64 bytesTotal) 下载进度信号
void finished() 下载完毕信号
void readyRead() 有数据可读信号
练习:获取舔狗API的数据
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
//添加网络请求管理器
#include <QNetworkAccessManager>
#include <QLabel>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//1、新建网络请求管理器QNetworkAccessManager *manager = new QNetworkAccessManager(this);//2、关联管理器的finished信号connect(manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(replyFinished(QNetworkReply *)));//3、往http://qt-project.org 网站发起请求manager->get(QNetworkRequest(QUrl("http://v2.alapi.cn/api/dog?token=1tXlTpqdAcx4jXVm")));
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::replyFinished(QNetworkReply *reply)
{//读取所有的网络数据QString msg = reply->readAll();ui->textBrowser->setText(msg);}
- 注意:假如QT不能使用https,可以把https改为http
相关文章:

4、QT中的网络编程
一、Linux中的网络编程 1、子网和公网的概念 子网网络:局域网,只能进行内网的通信公网网络:因特网,服务器等可以进行远程的通信 2、网络分层模型 4层模型:应用层、传输层、网络层、物理层 应用层:用户自…...

单例模式(饿汉式单例 VS 懒汉式单例)
所谓的单例模式就是保证某个类在程序中只有一个对象 一、如何控制只产生一个对象? 1.构造方法私有化(保证对象的产生个数) 创建类的对象,要通过构造方法产生对象 构造方法若是public权限,对于类的外部,可…...

Oracle数据库连接之TNS-12541异常
在进行数据库开发的时候,通常需要使用PLSQL Developer开发工具连接Oralce数据库,在进行连接时,经常性的会提示TNS-12541:TNS:no listener(没有监听),从而导致PLSQL Developer 无法连接到数据库实例…...

sql中的排序函数dense_rank(),RANK()和row_number()
dense_rank(),RANK()和row_number()是SQL中的排序函数。 为方便后面的函数差异比对清晰直观,准备数据表如下: 1.dense_rank() 函数语法:dense_rank() over( order by 列名 【desc/asc】) DENSE_RANK()是连续排序,比如…...

Flask狼书笔记 | 05_数据库
文章目录 5 数据库5.1 数据库的分类5.2 ORM5.3 使用Flask_SQLAlchemy5.4 数据库操作5.5 定义关系5.6 更新数据库表5.7 数据库进阶小结 5 数据库 这一章学习如何在Python中使用DBMS(数据库管理系统),来对数据库进行管理和操作。本书使用SQLit…...

HJ70 矩阵乘法计算量估算
Powered by:NEFU AB-IN Link 文章目录 HJ70 矩阵乘法计算量估算题意思路代码 HJ70 矩阵乘法计算量估算 题意 矩阵乘法的运算量与矩阵乘法的顺序强相关。 例如: A是一个5010的矩阵,B是1020的矩阵,C是205的矩阵 计算ABC有两种顺序:…...

Doris数据库使用记录
新建表 create table tonly_attendance(vin varchar(64),diggings_name varchar(256),area varchar(64),diggings_type varchar(256),work_time decimal(20,2),engine_run_time decimal(20,2),upload_time varchar(64))DUPLICATE KEY (vin)distributed by hash (vin)删除之…...

华为OD机试真题【篮球比赛】
1、题目描述 【篮球比赛】 一个有N个选手参加比赛,选手编号为1~N(3<N<100),有M(3<M<10)个评委对选手进行打分。 打分规则为每个评委对选手打分,最高分10分,最低分1分。…...

sublime text 格式化json快捷键配置
以 controlcommandj 为例。 打开Sublime Text,依次点击左上角菜单Sublime Text->Preferences->Key Bindings,出现以下文件: 左边的是Sublime Text默认的快捷键,不可编辑。右边是我们自定义快捷键的地方,在中括号…...

Spring Cloud 面试题总结
Spring Cloud和各子项目版本对应关系 Spring Cloud 是一个用于构建分布式系统的开发工具包,它基于Spring Boot提供了一组模块和功能,用于构建微服务架构中的分布式应用程序。Spring Cloud的不同子项目有各自的版本,下面是一些常见的Spring C…...

如何实现24/7客户服务自动化?
传统的客服制胜与否的法宝在于人,互联网时代,对于产品线广的大型企业来说:单靠人力,成本大且效率低,相对于产品相对单一的中小型企业来说:建设传统客服系统的成本难以承受,企业客户服务的转型已…...

2022年12月 C/C++(六级)真题解析#中国电子学会#全国青少年软件编程等级考试
C/C++编程(1~8级)全部真题・点这里 第1题:区间合并 给定 n 个闭区间 [ai; bi],其中i=1,2,…,n。任意两个相邻或相交的闭区间可以合并为一个闭区间。例如,[1;2] 和 [2;3] 可以合并为 [1;3],[1;3] 和 [2;4] 可以合并为 [1;4],但是[1;2] 和 [3;4] 不可以合并。 我们的任务是…...

【Spring Cloud系列】 雪花算法原理及实现
【Spring Cloud系列】 雪花算法原理及实现 文章目录 【Spring Cloud系列】 雪花算法原理及实现一、概述二、生成ID规则部分硬性要求三、ID号生成系统可用性要求四、解决分布式ID通用方案4.1 UUID4.2 数据库自增主键4.3 基于Redis生成全局id策略 五、SnowFlake(雪花算…...

Postgresql 阿里云部署排雷
启动服务bug: 根据你的输出,可以看到 PostgreSQL 服务启动失败,并且显示以下错误消息: pg_ctl: cannot be run as root Please log in (using, e.g., "su") as the (unprivileged) user that will own the server proc…...

l8-d10 TCP协议是如何实现可靠传输的
一、TCP主要特点 TCP 是面向连接的运输层协议,在无连接的、不可靠的 IP 网络服务基础之上提供可靠交付的服务。为此,在 IP 的数据报服务基础之上,增加了保证可靠性的一系列措施。 TCP主要特点 1.TCP 是面向连接的运输层协议。 每一条 TCP 连…...

9月9日扒面经
堆和栈的区别? 分配方式:堆内存是由程序员手动分配和释放的,而栈内存是由编译器自动分配和释放的。内存管理:堆内存需要手动管理内存的分配和释放,程序员需要显式地调用malloc()或new来分配内存,并使用fre…...

项目实战:ES的增加数据和查询数据
文章目录 背景在ES中增加数据新建索引删除索引 在ES中查询数据查询数据总数量 项目具体使用(实战)引入依赖方式一:使用配置类连接对应的es服务器创建配置类编写业务逻辑----根据关键字查询相关的聊天内容在ES中插入数据 总结提升 背景 最近需…...

vs code调试rust乱码问题解决方案
在terminal中 用chcp 65001 修改一下字符集,就行了。有的博主推荐 修改 区域中的设置,这会引来很大的问题。千万不要修改如下设置:...

大数据课程K22——Spark的SparkSQL的API调用
文章作者邮箱:yugongshiye@sina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 掌握Spark的通过api使用SparkSQL; 一、通过api使用SparkSQL 1. 实现步骤 1. 打开scala IDE开发环境,创建一个scala工程。 2. 导入spark相关依赖jar包。 3. 创建包路径以object类。 4.…...

数据结构学习系列之顺序表的两种删除方式
方式1:在顺序表的末端删除所存储的数据元素,代码如下:示例代码: int delete_seq_list_1(list_t *seq_list){if(NULL seq_list){printf("入参为NULL\n");return -1;}if(0 seq_list->count){printf("顺序表为空…...

机器学习笔记之最优化理论与方法(七)无约束优化问题——常用求解方法(上)
机器学习笔记之最优化理论与方法——基于无约束优化问题的常用求解方法[上] 引言总体介绍回顾:线搜索下降算法收敛速度的衡量方式线性收敛范围高阶收敛范围 二次终止性朴素算法:坐标轴交替下降法最速下降法(梯度下降法)梯度下降法的特点 针对最速下降法缺…...

ES-索引管理
前言 数据类型 搜索引擎是对数据的检索,所以我们先从生活中的数据说起。我们生活中的数据总体分为两种: 结构化数据非结构化数据 结构化数据: 也称作行数据,是由二维表结构来逻辑表达和实现的数据,严格地遵循数…...

linux中常用shell脚本整理
linux常见shell脚本整理 备份日志 #!/bin/bash # 每日创建新的备份日志-根据日期备份 tar -czf log-date %Y%m%d.tar.gz /var/log # 通过crontab 每日定时启动 00 03 * * 5 /root/logbak.sh 监控内存和磁盘容量,小于给定值时报警 #!/bin/bash # 实…...

介绍PHP
PHP是一种流行的服务器端编程语言,用于开发Web应用程序。它是一种开源的编程语言,具有易学易用的语法和强大的功能。PHP支持在服务器上运行的动态网页和Web应用程序的快速开发。 PHP可以与HTML标记语言结合使用,从而能够生成动态的Web页面&a…...

selenium+find_elements用法
1、假如我们遇到多个标签的class一样,比如像下面这样的 我们可以采用js语法去定位,比如: document.getElementsByClassName("ant-calendar-picker-input ant-input")[0]...

1DM+下载器_11.2.1魔改增强版下载
1DM「原:IDM」下载器是一款安卓端的下载工具,多语言解锁版直安装版本,号称是目前 Android 平台最快、最先进的下载管理器应用「支持通过Torrent下载」,而这个版本是改线程的最新idm版本,可用来下载视频、音乐、电影、T…...

vue3:3、项目目录和关键文件
关于vsvode的更改 <!-- 加上setup允许在script中直接编写组合式api --> <script setup> // 组件引入后直接用 import HelloWorld from ./components/HelloWorld.vue import TheWelcome from ./components/TheWelcome.vue</script><!-- 1、js放在最上面&am…...

ChatGPT实战与私有化大模型落地
文章目录 大模型现状baseline底座选择数据构造迁移方法评价思考 领域大模型训练技巧Tokenizer分布式深度学习数据并行管道并行向量并行分布式框架——Megatron-LM分布式深度学习框架——Colossal-AI分布式深度学习框架——DeepSpeedP-tuning 微调 资源消耗模型推理加速模型推理…...

10分钟从实现和使用场景聊聊并发包下的阻塞队列
上篇文章12分钟从Executor自顶向下彻底搞懂线程池中我们聊到线程池,而线程池中包含阻塞队列 这篇文章我们主要聊聊并发包下的阻塞队列 阻塞队列 什么是队列? 队列的实现可以是数组、也可以是链表,可以实现先进先出的顺序队列,…...

Python入门学习13(面向对象)
一、类的定义和使用 类的使用语法: 创建类对象的语法: class Student:name None #学生的名字age None #学生的年龄def say_hi(self):print(f"Hi大家好,我是{self.name}")stu Student() stu.name &q…...