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_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;

    // 自定义如下
private:
    QTcpServer *tcpserver; //TCP服务器
    QTcpSocket *tcpsocket;// TCP通讯socket
    QString 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_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    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);

}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vscode字符多行自动增长插件。

多行字符自动增长插件CharAutoIncre 当你使用shiftalt选中了多行,并输入了’1’,这时这几行都变成了’1’. 这时你可以选中&#xff08;shift左键&#xff09;为’1’的这几行, 接下来按下shiftaltq此时’1’变为了’12345’自增长的样式。 同时本插件支持字符’a-z,A-Z’。 目…

windows环境下,怎么查看本机的IP、MAC地址和端口占用情况

1.输入ipconfig,按回车。即查看了IP地址&#xff0c;子码掩码&#xff0c;网关信息。 2.输入ipconfig/all,按回车。即查看了包含IP地址&#xff0c;子码掩码&#xff0c;网关信息以及MAC地址 3.我们有时在启动应用程序的时候提示端口被占用&#xff0c;如何知道谁占有了我们需要…

「布道师系列文章」宝兰德徐清康解析 Kafka 和 AutoMQ 的监控

作者&#xff5c;北京宝兰德公司解决方案总监徐清康 01 前言 当我们使用一个软件的时候&#xff0c;经常都会问这个软件怎么监控、监控他的哪些指标&#xff1f;Kafka 的监控挺长时间都是一个老大难的问题&#xff0c;社区在监控方面一直没有投入太大的精力。如果要实现一…

深入解析OOM问题与解决方案:一次实战排查经历

近日&#xff0c;公司服务突然出现连续不断的Full GC&#xff08;Full Garbage Collection&#xff0c;全垃圾回收&#xff09;&#xff0c;在短短时间内发生了四次&#xff0c;之后服务竟然自动重启。这一异常情况让我们团队倍感困扰&#xff0c;因为在系统监控中&#xff0c;…

Spring Boot集成vaadin快速入门demo

1.什么是vaadin&#xff1f; Vaadin 是用于构建单页 Web 应用的流行 Java 框架。 它由一家专门从事富 Internet 应用设计和开发的芬兰公司开发。 估计有 15 万开发者使用 Vaadin。 它的开发始于 2002 年。 Vaadin 框架特性 以下是 Vaadin 特性的列表&#xff1a; 这是一个 J…

PHP蜜语翻译器在线文字转码解码源码

源码介绍 PHP蜜语翻译器在线文字转码解码源码 文字加密通话、一键转换、蜜语密码 无需数据库,可以将文字、字母、数字、代码、表情、标点符号等内容转换成新的文字形式&#xff0c;通过简单的文字以不同的排列顺序来表达不同的内容&#xff01;支持在线加密解密 有多种加密展示…

物联网技术-第3章物联网感知技术-3.2定位技术

目录 1.1位置信息和位置服务 1.1.1位置信息 1.1.2位置服务 1.2主流定位系统 1.2.1卫星定位系统&#xff08;Satellite Positioning Systems&#xff09; 1.2.2移动通信蜂窝基站定位&#xff08;Cellular Triangulation or Advanced Forward Link Trilateration&#xff09…

使用 Iceberg、Tabular 和 MinIO 构建现代数据架构

现代数据环境需要一种新型的基础架构&#xff0c;即无缝集成结构化和非结构化数据、轻松扩展并支持高效的 AI/ML 工作负载的基础架构。这就是现代数据湖的用武之地&#xff0c;它为您的所有数据需求提供了一个中心枢纽。然而&#xff0c;构建和管理有效的数据湖可能很复杂。 这…

MySQL之优化服务器设置和复制(一)

优化服务器设置 操作系统状态 CPU密集型的机器 CPU密集型服务器的vmstat输出通常在us列会有一个很高的值&#xff0c;报告了花费在非内核代码上的CPU时钟;也可能在sy列有很高的值&#xff0c;表示系统CPU利用率&#xff0c;超过20%就足以令人不安了。在大部分情况下&#xff…

无代码爬虫软件八爪鱼采集器-如何设计判断是、否

我们在设计采集规则的时候&#xff0c;可能会需要判断&#xff0c;比如采集评论的时候“展开更多回复”&#xff0c;就点击这个按钮&#xff0c;像这种情况就可以设计一个判断模块进入 判断模块添加后会自动生成两个&#xff0c;默认都是不判断直接执行&#xff0c;如果我们需要…

网络安全:数据库安全性

文章目录 网络安全&#xff1a;数据库安全性引言数据库安全性的重要性常见的数据库安全威胁数据库安全性的最佳实践数据加密访问控制审计和监控 结语 网络安全&#xff1a;数据库安全性 引言 在前两篇文章中&#xff0c;我们讨论了SQL注入的概念和防范措施。本篇文章将聚焦于…

记一次线上jVM调优

文章目录 问题描述问题分析尝试优化业务代码优化方案修改后代码补充点 问题描述 部门调整&#xff0c;接手一个新项目&#xff0c;为方便后续描述叫user-web&#xff0c;随后推动IT降本&#xff0c;要求根据实际业务量调整服务器实例数量和配置&#xff0c;调整前服务器配置为…

【DevOps】Elasticsearch 数据跨集群同步方案

目录 1、Elasticsearch Cross-Cluster Replication (CCR) 1.1、优点 1.2、缺点 1.3、步骤 1.4、示例 2. Logstash 或其他 ETL 工具 2.1、优点 2.2、缺点 2.3、步骤 3. Apache Kafka 或 RabbitMQ 3.1、优点 3.2、缺点 3.3、步骤 4、使用 Reindex API 进行跨集群同…

基于 Thingsboard 定制开发,国产化企业级、低代码 AIoT 物联网平台

项目源码&#xff0c;文末联系小编 01 ThingsKit 物联网平台 ThingsKit 是基于 Thingsboard 开源物联网平台二次开发&#xff0c;面向中小型企业开箱即用的低代码物联网平台&#xff0c;提供N1N&#xff08;N个终端产品1个物联网平台N个行业方案&#xff09;的产品服务矩阵&…

2024爱分析·AI Agent创新成就奖开启申报丨奖项征集

AI Agent正成为企业数字化转型的关键力量。它们不仅提升了工作效率&#xff0c;优化了客户体验&#xff0c;更是在数据分析、决策支持和自动化流程中扮演着至关重要的角色。随着技术的不断进步和应用场景的拓展&#xff0c;AI Agent正以其独特优势&#xff0c;引领企业进入一个…

我的第一个 iOS 程序:iTahDoodle

我的第一个 iOS 程序&#xff1a;iTahDoodle 我的第一个 iOS 程序&#xff1a;iTahDoodle应用功能对象图应用委托对象设置视图为按钮关联动作方法为 UITableView 对象提供数据保存并加载任务数据在模拟器上运行程序下载链接 我的第一个 iOS 程序&#xff1a;iTahDoodle 实现了…

QT——MySQL数据库联用

一、ODBC 1、ODBC简介 ODBC全称为Open Database Connectivity,是一种用于数据库操作的标准接口。要使用ODBC,首先需要安装相应的ODBC驱动程序,然后在系统中配置ODBC数据源。接着,可以通过编程语言(如C++、Java等)或者数据库工具(如SQL Server Management Studio)来连…

深度学习推理显卡设置

深度学习推理显卡设置 进入NVIDIA控制面板&#xff0c;选择 “管理3D设置”设置 "低延时模式"为 "“超高”"设置 “电源管理模式” 为 “最高性能优先” 使用锁频来获得稳定的推理 法一&#xff1a;命令行操作 以管理员身份打开CMD查看GPU核心可用频率&…

AIoT设备新一代高性能处理器瑞芯微RK3576,东胜物联RK3588等核心板定制开发

随着物联网、人工智能和嵌入式技术的不断发展&#xff0c;智能设备应用对芯片处理器的性能需求越来越高&#xff0c;以满足复杂的数据处理需求、实时性要求、复杂的算法运算和多任务处理能力。高性能的芯片可以为智能设备提供更强大的计算能力和更快速的响应速度&#xff0c;从…

通过nginx转发后应用偶发502bad gateway

序言 学习了一些东西&#xff0c;如何才是真正自己能用的呢&#xff1f;好像就是看自己的潜意识的反应&#xff0c;例如解决了一个问题&#xff0c;那么下次再碰到类似的问题&#xff0c;能直接下意识的去找到对应的信息&#xff0c;从而解决&#xff0c;而不是和第一次碰到一样…