71-TCP协议工作原理及实战

一 服务器端

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QTcpServer> // 专门用于建立TCP连接并传输数据信息
#include <QtNetwork> // 此模块提供开发TCP/IP客户端和服务器的类QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private:Ui::MainWindow *ui;// 自定义如下
private:QTcpServer *tcpserver; //TCP服务器QTcpSocket *tcpsocket;// TCP通讯socketQString GetLocalIpAddress(); // 获取本机的IP地址private slots:void clientconnect();void clientdisconnect();void socketreaddata();void newconnection();void on_pushButton_Start_clicked();void on_pushButton_Stop_clicked();void on_pushButton_Send_clicked();
protected:void closeEvent(QCloseEvent *event);
};
#endif // MAINWINDOW_H***************************************************************
***************************************************************
mainwindow.cpp#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//测试是否获取本地地址QString strip = GetLocalIpAddress();QMessageBox::information(this,"数据",strip,QMessageBox::Yes);//添加到comboxip里面ui->comboBoxIp->addItem(strip);//调用监听tcpserver = new QTcpServer(this);connect(tcpserver,SIGNAL(newConnection()),this,SLOT(newconnection()));}MainWindow::~MainWindow()
{delete ui;
}
// 获取本机的IP地址
QString MainWindow::GetLocalIpAddress()
{QString hostname=QHostInfo::localHostName();QHostInfo hostinfo=QHostInfo::fromName(hostname);QString localip="";QList<QHostAddress> addresslist=hostinfo.addresses();if(!addresslist.isEmpty()){for (int i=0;i<addresslist.count();i++){QHostAddress addrhost=addresslist.at(i);if(QAbstractSocket::IPv4Protocol==addrhost.protocol()){localip=addrhost.toString();break;}}}return localip;
}void MainWindow::clientconnect()
{//客户端连接ui->plainTextEdit_DispMsg->appendPlainText("****客户端套接字socket连接****");ui->plainTextEdit_DispMsg->appendPlainText("**********peer address:"+tcpsocket->peerAddress().toString());ui->plainTextEdit_DispMsg->appendPlainText("**********peer port:"+QString::number(tcpsocket->peerPort()));}void MainWindow::clientdisconnect()
{//客户端断开连接ui->plainTextEdit_DispMsg->appendPlainText("**********客户端socket断开连接**********");tcpsocket->deleteLater();
}void MainWindow::socketreaddata()
{//读取数据while(tcpsocket->canReadLine()){ui->plainTextEdit_DispMsg->appendPlainText("[in]"+tcpsocket->readLine());}}//新建连接
void MainWindow::newconnection()
{//连接tcpsocket = tcpserver->nextPendingConnection();connect(tcpsocket,SIGNAL(connect()),this,SLOT(clientconnect()));clientconnect();//断开连接connect(tcpsocket,SIGNAL(disconnect()),this,SLOT(clientdisconnect()));//读数据connect(tcpsocket,SIGNAL(readyRead()),this,SLOT(socketreaddata()));//状态connect(tcpsocket,SIGNAL(stateChanged(QAbstractSocket::SocketState)),this,SLOT(OnSocketStateChanged(QAbstractSocket::SocketState)));
}//启动服务
void MainWindow::on_pushButton_Start_clicked()
{//开始监听QString ip = ui->comboBoxIp->currentText();qint16 port = ui->spinBoxPort->value();QHostAddress address(ip);tcpserver->listen(address,port);ui->plainTextEdit_DispMsg->appendPlainText("$$$$$开始监听$$$$$$");ui->plainTextEdit_DispMsg->appendPlainText("$$$$$$$$$$服务器地址$$$$$$$$$$:"+tcpserver->serverAddress().toString());ui->plainTextEdit_DispMsg->appendPlainText("$$$$$$$$$$服务器端口$$$$$$$$$$:"+QString::number(tcpserver->serverPort()));ui->pushButton_Start->setEnabled(false);ui->pushButton_Stop->setEnabled(true);}void MainWindow::on_pushButton_Stop_clicked()
{if(tcpserver->isListening()){tcpserver->close();ui->pushButton_Start->setEnabled(true);ui->pushButton_Stop->setEnabled(false);}
}void MainWindow::on_pushButton_Send_clicked()
{QString strmsg = ui->lineEdit_InputMsg->text();ui->plainTextEdit_DispMsg->appendPlainText("[out]"+strmsg);ui->lineEdit_InputMsg->clear();QByteArray str = strmsg.toUtf8();str.append("\n");tcpsocket->write(str);}void MainWindow::closeEvent(QCloseEvent *event)
{if(tcpserver->isListening()){tcpserver->close();}event->accept();
}*********************************************************

二 客户端

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QTcpSocket> // 专门用于建立TCP连接并传输数据信息
#include <QHostAddress>
#include <QHostInfo>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private:Ui::MainWindow *ui;
private:QTcpSocket *tcpclient;//客户端tcp套接字QString getlocalip();//获取本机ip地址
protected:void closeEvent(QCloseEvent *event);
private slots:void clientfunc();void disclientfunc();void socketreaddata();void on_pushButton_Connect_clicked();void on_pushButton_Disconnect_clicked();void on_pushButton_Send_clicked();
};
#endif // MAINWINDOW_H**********************************************************
.c#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);tcpclient = new QTcpSocket(this);QString strip = getlocalip();ui->comboBoxIp->addItem(strip);connect(tcpclient,SIGNAL(connected()),this,SLOT(clientfunc()));connect(tcpclient,SIGNAL(disconnected()),this,SLOT(disclientfunc()));connect(tcpclient,SIGNAL(readyRead()),this,SLOT(socketreaddata()));}MainWindow::~MainWindow()
{delete ui;
}
//获取本机ip
QString MainWindow::getlocalip()
{QString hostname = QHostInfo::localHostName();QHostInfo hostinfo = QHostInfo::fromName(hostname);QString localip = "";QList<QHostAddress> addlist = hostinfo.addresses();if(!addlist.isEmpty()){for(int i = 0;i < addlist.count();i++){QHostAddress ahost = addlist.at(i);if(QAbstractSocket::IPv4Protocol==ahost.protocol()){localip = ahost.toString();break;}}}return localip;
}void MainWindow::closeEvent(QCloseEvent *event)
{if(tcpclient->state()==QAbstractSocket::ConnectedState){tcpclient->disconnectFromHost();}event->accept();
}
void MainWindow::clientfunc()
{ui->plainTextEdit_DispMsg->appendPlainText("**已经连接到服务器端");ui->plainTextEdit_DispMsg->appendPlainText("**peer address:"+tcpclient->peerAddress().toString());ui->plainTextEdit_DispMsg->appendPlainText("**peer port:"+QString::number(tcpclient->peerPort()));ui->pushButton_Connect->setEnabled(false);ui->pushButton_Disconnect->setEnabled(true);}void MainWindow::disclientfunc()
{ui->plainTextEdit_DispMsg->appendPlainText("**已经断开与服务器的连接");ui->pushButton_Connect->setEnabled(true);ui->pushButton_Disconnect->setEnabled(false);}void MainWindow::socketreaddata()
{while(tcpclient->canReadLine()){ui->plainTextEdit_DispMsg->appendPlainText("[in]"+tcpclient->readLine());}
}void MainWindow::on_pushButton_Connect_clicked()
{QString addr = ui->comboBoxIp->currentText();qint16 port = ui->spinBoxPort->value();tcpclient->connectToHost(addr,port);
}void MainWindow::on_pushButton_Disconnect_clicked()
{if(tcpclient->state()==QAbstractSocket::ConnectedState){tcpclient->disconnectFromHost();}}void MainWindow::on_pushButton_Send_clicked()
{QString strmsg = ui->lineEdit_InputMsg->text();ui->plainTextEdit_DispMsg->appendPlainText("[out]:"+strmsg);ui->lineEdit_InputMsg->clear();QByteArray str = strmsg.toUtf8();str.append("\n");tcpclient->write(str);}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/856847.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

164万年后的日期解析引发的OOM

名词解释 商家销项发票业务&#xff08;平台给商家开票&#xff09;&#xff0c;是平台提供给商家的工具产品&#xff0c;商家购买了平台的服务&#xff0c;那么平台需要开票给商家。 前言 本文所描述的问题&#xff0c;是应用的OOM引发的接口成功率下跌&#xff0c;排查过程中…

改进YOLO系列 | 谷歌团队 | CondConv:用于高效推理的条件参数化卷积

CondConv&#xff1a;用于高效推理的条件参数化卷积&#xff08;中文综述&#xff09; 简介 YOLO系列目标检测算法以其速度和精度著称&#xff0c;但其推理速度仍然存在提升空间。 谷歌团队提出的CondConv&#xff08;Conditional Parameterized Convolution&#xff09;是一…

【LLM之NL2SQL】DAIL-SQL论文阅读笔记

研究背景 该研究旨在提供一个全面、系统的评估框架&#xff0c;用于评估基于大型语言模型&#xff08;LLM&#xff09;的Text-to-SQL技术。特别强调了不同的提示工程策略的有效性和效率&#xff0c;以及开源LLM的可行性。研究的重点是评估在零样本和少样本场景下的不同问题表示…

webgis 之 地图投影

地图投影 什么是地图投影目的种类等角投影的分类墨卡托投影Web 墨卡托投影 参考小结 为了更好地展示地球上的数据&#xff0c;需要将地球投影到一个平面上。地图投影是一个数学问题&#xff0c;按照一定的几何关系&#xff0c;将地球上的经纬度坐标映射到一个平面上的坐标。地球…

力扣hot100:(The Last one)287. 寻找重复数(快慢指针,静态链表)

LeetCode&#xff1a;287. 寻找重复数 “暴力” 不懂技巧&#xff0c;那就暴力&#xff01; 哈希表&#xff1a; 时间复杂度&#xff1a; O ( n ) O(n) O(n) 这个题体现不出 O ( n ) O(n) O(n)的作用&#xff0c;因为 n < 100 n < 100 n<100 空间复杂度&…

区块链技术介绍和用法

区块链技术是一种分布式账本技术&#xff0c;可以记录和存储一系列交易信息&#xff0c;并通过密码学算法保证信息的安全性和不可篡改性。区块链技术的核心概念是“区块”和“链”。 每个区块包含了一部分交易信息&#xff0c;以及一个指向上一个区块的哈希值。当新的交易发生…

VirtualBox出错,从主机复制文件,乱改内容

昨天烧录机器&#xff0c;测试对方更新的一个库&#xff1a; 开始正确。后来莫名其妙崩溃。反复烧了几次&#xff0c;都错误。复制了老版本的库&#xff0c;正常。再改回新版本&#xff0c;崩溃。 于是把整个打包目录给了对方&#xff0c;他一对比&#xff0c;发现文件不对&am…

Windows应急响应靶机 - Web2

一、靶机介绍 应急响应靶机训练-Web2 前景需要&#xff1a;小李在某单位驻场值守&#xff0c;深夜12点&#xff0c;甲方已经回家了&#xff0c;小李刚偷偷摸鱼后&#xff0c;发现安全设备有告警&#xff0c;于是立刻停掉了机器开始排查。 这是他的服务器系统&#xff0c;请你…

Springboot获取resources中的文件

1.Springboot以文件的形式获取resources中的文件 import com.google.gson.JsonIOException; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.google.gson.JsonSyntaxException; import org.springframework.util.ResourceUtils; import j…

2024.6最新版eclipse下载与安装(汉化教程)超详细教程来咯!!!包懂的

1.eclipse简介 Eclipse 是一个开放源代码的集成开发环境&#xff08;IDE&#xff09;&#xff0c;主要用于Java编程&#xff0c;但也可以通过插件支持其他编程语言&#xff0c;如C/C、Python、Perl等。Eclipse 被广泛应用于企业环境中&#xff0c;特别是在Java社区中&#xff0…

PyMuPDF 操作手册 - 02 PDF 中图像的提取、插入、创建等

文章目录 三、PDF 中提取和插入图像3.1 从 PDF 中提取图像3.2 提取矢量图形3.3 向 PDF 添加图像3.4 如何从文档页面制作图像3.5 如何提高图像分辨率3.6 如何创建局部像素贴图(剪辑)3.7 如何将剪辑缩放到 GUI 窗口3.8 如何创建或隐含注释图像3.9 如何提取图像:非 PDF 文档3.1…

selenium常见难点解决方案

勾选框勾选问题 勾选框代码逻辑实现过程&#xff1a; 第一步&#xff1a;首先找到勾选框的元素&#xff1b; 第二步&#xff1a;检查它是否已经被勾选。如果已经勾选&#xff0c;则进行取消勾选操作&#xff1b;如果未勾选&#xff0c;则进行点击勾选操作&#xff1b; 以下是一…

NGINX_十四 nginx 日志配置

十四 nginx 日志配置 1 nginx 日志介绍 ​ nginx 有一个非常灵活的日志记录模式,每个级别的配置可以有各自独立的访问日志, 所需日志模块 ngx_http_log_module 的支持&#xff0c;日志格式通过 log_format 命令来定义&#xff0c;日志对于统计和排错是非常有利的&#xff0c;…

详解 ClickHouse 的 SQL 操作

传统关系型数据库&#xff08;以 MySQL 为例&#xff09;的 SQL 语句&#xff0c;ClickHouse 基本都支持 一、插入 --语法&#xff1a; insert into table_name values(xxxxxx),(yyyyyyy),...;insert into table_name select xxxxx from table_name2 where yyyyy;二、更新和删…

代码随想录算法训练营第41天 [01背包的理论基础,二维数组解法,一维数组解法,416. 分割等和子集]

代码随想录算法训练营第41天 [01背包的理论基础&#xff0c;二维数组解法&#xff0c;一维数组解法&#xff0c;416. 分割等和子集] 一、01背包的二维数组解法 链接: 代码随想录. 思路&#xff1a;dp数组, dp[i][j]代表行李箱空间为j的情况下,从下标为[0, i]的物品里面任意取,能…

本次刷题的错题模版分析-2024年6月21日

对于错题进行分析是一个非常好的学习习惯&#xff0c;这有助于你理解自己的错误并避免将来再次犯同样的错误。以下是一个错题分析的模板&#xff0c;你可以根据自己的需要进行调整&#xff1a; 1. 错题记录 题目&#xff1a;[下列关于数组运算的描述错误的是( )。 在NumPy中&am…

C# —— 属性和字段

属性和字段的区别 1.都是定义在一个类中&#xff0c;属于类成员变量 2.字段一般都是私有的private&#xff0c;属性一般是公开的Public 3.字段以小驼峰命名方式 age&#xff0c;属性一般是以大驼峰命名 Age 4.字段可以存储数据&#xff0c;属性不能存储数据&#xff0c;通过属性…

audacity音频处理

1.安装 Audacity | Free Audio editor, recorder, music making and more! 添加OpenVINO插件: https://zhuanlan.zhihu.com/p/676542556 2.使用 2.1注意事项 1.编辑音频,点击左上方打开或导入都可以;打开视频文件则需要安装ffmpeg模块,打开后只显示视频中的音频信息; 2.编辑…

P5712 【深基3.例4】Apples

1. 题目链接 https://www.luogu.com.cn/problem/P5712 P5712 【深基3.例4】Apples 2. 题目描述 题目描述&#xff1a;小B吃了x个苹果&#xff0c;用Today, I ate x apple.造句 输入&#xff1a;输入一个自然数x 输出&#xff1a;句子 3. 我的思考 用if-else判断就行 4. 我提交…

可变分区管理 分区分配算法

First Fit Algorithm Best Fit Algorithm FFA&#xff1a;按照分区编号找到第一个能装下进程的起始地址填入第二个表 此时 原表中将起始地址进程大小 分区大小-进程大小 如此继续 BFA&#xff1a;按分区大小排序 从小到大 找到第一个能装下的 剩余步骤和FFA一样 装满了可以直…