Qt TCP (小型聊天窗口)

news2024/11/24 3:04:59

实现的具体功能为:

  1. 服务器端需要主动监听,可以主动断开连接,可以发送信息给客户端
  2. 客户端需要输入主机,端口号,需要主动连接,可以主动断开连接,可以发送信息给服务器端
  3. 服务器端和客户端都能看到聊天记录

服务器端的搭建:

创建一个TCP_Server项目

1.首先在.Pro文件中添加:

QT+=network

ui界面中添加以下控件:

 2. tcp_server.h文件

#ifndef TCP_SERVER_H
#define TCP_SERVER_H

#include <QWidget>
#include<QTcpServer>
#include<QTcpSocket>
QT_BEGIN_NAMESPACE
namespace Ui { class tcp_server; }
QT_END_NAMESPACE

class tcp_server : public QWidget
{
    Q_OBJECT

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

private slots:
    void on_pushButton_clicked();

    void on_pushButton_3_clicked();

    void on_pushButton_2_clicked();

private:
    Ui::tcp_server *ui;
    QTcpServer * server;//服务器对象
    QTcpSocket * socket=nullptr;//套接字


};
#endif // TCP_SERVER_H

3.tcp_server.cpp文件

#include "tcp_server.h"
#include "ui_tcp_server.h"
#include<QMessageBox>
tcp_server::tcp_server(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::tcp_server)
{
    ui->setupUi(this);
    server=new QTcpServer(this);
    connect(server,&QTcpServer::newConnection,[=]()//当有连接时
    {
        int ret=QMessageBox::information(this,"提示信息","已有连接,是否连接。",QMessageBox::Yes|QMessageBox::No);
        if(ret==QMessageBox::Yes)
        {
            QMessageBox::information(this,"提示信息","已成功连接。",QMessageBox::Ok);
            socket=new QTcpSocket;
            socket=server->nextPendingConnection();//获取套接字
            connect(socket,&QTcpSocket::readyRead,[=]()//如果有新数据
            {
                QByteArray S=socket->readAll();//读取全部内容
                QString str=S.data();//转化为字符串格式
                ui->textEdit->append(QString("客户端:%1").arg(str));//把数据添加到textEdit中
            });
            connect(socket,&QTcpSocket::disconnected,socket,&QTcpSocket::deleteLater);//断开连接后,删除该套接字
        }
        else
        {
            QMessageBox::information(this,"提示信息","已拒绝连接。",QMessageBox::Ok);
        }

    });

}

tcp_server::~tcp_server()
{
    delete ui;
}


void tcp_server::on_pushButton_clicked()//listen
{
    //监听主机和端口
    if(!server->listen(QHostAddress("127.0.0.1"),6000))
    {
        QMessageBox::information(this,"提示信息","未监听成功",QMessageBox::Ok);
    }
}

void tcp_server::on_pushButton_3_clicked()//断开连接
{
    if(socket==nullptr)
    {
        QMessageBox::information(this,"提示信息","暂无连接。",QMessageBox::Ok);
    }
    else
    {
        socket->disconnectFromHost();//断开连接,如有未接收完的数据,要先接收完
        QMessageBox::information(this,"提示信息","已成功断开。",QMessageBox::Ok);
        delete socket;//释放内存
        socket=nullptr;//置空
    }

}

void tcp_server::on_pushButton_2_clicked()//发送数据
{
    if(socket==nullptr)
    {
        QMessageBox::information(this,"提示信息","暂无连接,无法传输数据。",QMessageBox::Ok);
    }
    else
    {
        ui->textEdit->append(QString("服务器端:%1").arg(ui->lineEdit->text()));//把记录放在textEdit中
        QByteArray S=ui->lineEdit->text().toUtf8();//将QString转化为QByteQrray
        socket->write(S);//传输数据
    }
}

客户端的搭建:

创建一个TCP_Client项目

1.pro文件添加

QT+=network

ui界面中添加:

 2. tcp_client.h文件

#ifndef TCP_CLIENT_H
#define TCP_CLIENT_H

#include <QWidget>
#include<QTcpSocket>
QT_BEGIN_NAMESPACE
namespace Ui { class tcp_client; }
QT_END_NAMESPACE

class tcp_client : public QWidget
{
    Q_OBJECT

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

private slots:
    void on_pushButton_clicked();//连接

    void on_pushButton_2_clicked();//断开

    void on_pushButton_3_clicked();//发送

private:
    Ui::tcp_client *ui;
    QTcpSocket *Socket;//套接字

};
#endif // TCP_CLIENT_H

3.tcp_client.cpp文件

#include "tcp_client.h"
#include "ui_tcp_client.h"
#include<QMessageBox>
tcp_client::tcp_client(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::tcp_client)
{
    ui->setupUi(this);
    Socket=new QTcpSocket(this);
    connect(Socket,&QTcpSocket::readyRead,[=]()
    {
        QByteArray bt=Socket->readAll();//读取服务器发送的内容
        QString str=bt.data();//转化为QString
        ui->textEdit->append(QString("服务器:%1").arg(str));//把内容放在textEdit
    });

}

tcp_client::~tcp_client()
{
    delete ui;
}


void tcp_client::on_pushButton_clicked()//连接到服务器
{
    Socket->abort();//断开已有连接
    Socket->connectToHost(ui->lineEdit->text(),ui->lineEdit_2->text().toInt());//连接到服务器
}

void tcp_client::on_pushButton_2_clicked()//断开
{
    Socket->disconnectFromHost();//断开连接
    QMessageBox::information(this,"提示信息","已断开",QMessageBox::Ok);
}

void tcp_client::on_pushButton_3_clicked()//发送
{
    if(Socket->state()==QAbstractSocket::ConnectedState)//如果为连接状态
    {
        ui->textEdit->append(QString("客户端:%1").arg(ui->lineEdit_3->text()));//把内容添加到textEdit中
        QByteArray bta=ui->lineEdit_3->text().toUtf8();
        Socket->write(bta);//传输数据
    }
    else
    {
        QMessageBox::information(this,"提示信息","未连接,无法发送",QMessageBox::Ok);
    }
}

以下为运行过程:

 输入主机和端口号然后点击连接,然后点击listen监听

 点击yes即可连接

 服务器端向客户端发信息:

 客户端向服务器端发信息:

 点击断开连接,即可断开:

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

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

相关文章

【C++算法图解专栏】一篇文章带你掌握差分算法

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4e3;专栏定位&#xff1a;为 0 基础刚入门数据结构与算法的小伙伴提供详细的讲解&#xff0c;也欢迎大佬们一起交流~ &#x1f4da;专栏地址&#xff1a;https://blog.csdn.net/Newin…

hadoop.fs.FileSystem.get导致OOM的原因和解决方案

问题描述 在调用HDFS获取文件系统的get接口时&#xff0c;指定用户可能会导致OOM问题&#xff0c;示例代码如下&#xff1a; FileSystem fileSystem FileSystem.get(uri, conf, "hadoopuser");问题溯源 该方法源码&#xff1a; 在有缓存的情况下将从Cache中取&a…

Android 11 SystemUI(状态/导航栏)-状态栏下拉时图标的隐藏与通知面板的半透黑色背景

概述 本文续自:Android 11 的状态栏的隐藏 PS 本文虽然同属于SystemUI, 但目前并 没有 打算整理成专橍或撰写一个系列的想法. 仅仅为了记录一些过程, 留下那些容易被遗忘的点滴. 开始下拉时状态栏图标被隐藏 状态橍的图标在用户开始触摸(ACTION_DOWN)后, 会开始展开, 显示扩展…

答题小程序题目批量导入模板以及题库文本格式规范

近期又接到了一个知识竞赛的需求&#xff0c;在开发答题小程序的过程中&#xff0c;遇到了不少难题&#xff0c;但是都一一克服了。凭借多年的答题小程序开发经验&#xff0c;我总结了一下题目批量导入题库文本格式规范。一、答题小程序题目批量导入模板小程序【答题小博士】二…

《数字经济全景白皮书》后疫情时代数字化驱动增长洞察之赛道篇

易观分析&#xff1a;《数字经济全景白皮书》浓缩了易观分析对于数字经济各行业经验和数据的积累&#xff0c;并结合数字时代企业的实际业务和未来面临的挑战&#xff0c;以及数字技术的创新突破等因素&#xff0c;最终从数字经济发展大势以及各领域案例入手&#xff0c;帮助企…

面试之 Python 框架 Flask、Django、DRF

Django、flask、tornado 框架的比较 ★★★★★ Django&#xff1a;大而全的框架。它的内部组件比较多&#xff0c;如 ORM、Admin、中间件、Form、ModelForm、Session、缓存、信号、CSRF等&#xff0c;功能也都很完善。 flask&#xff1a;微型框架&#xff0c;内部组件就比较少…

JavaScript中的事件对象、事件对象的属性

一、什么是事件对象​ 1&#xff09;、 事件对象 就是保存着事件相关信息的对象。当事件发生时&#xff0c;会自动产生事件对象&#xff08;不需要new&#xff09;&#xff0c;事件对象中包含着&#xff1a;事件源&#xff08;发生事件的dom元素&#xff09;&#xff0c;点击是…

全网最详细的mybatis plus 条件构造器queryWrapper学习,比如and(),eq(),or(),like()等方法以及分页操作

文章目录1. 引言2. 结构关系3. 环境配置3.1 引入jar包3.2 创建数据源3.2 创建User实体类3.4 创建UserMapper类3.5 创建UserService类4. 操作演示5. 注意事项1. 引言 mybatis大家都有使用过&#xff0c;既面向对象又灵活可配。不友好的地方是&#xff0c;会随着使用出现大量xml…

一篇文章带你读懂AVL树

目录 AVL树节点的定义 AVL树的插入 AVL树的旋转 1. 新节点插入较高左子树的左侧---左左&#xff1a;右单旋 2.新节点插入较高右子树的右侧---右右&#xff1a;左单旋 3. 新节点插入较高左子树的右侧---左右&#xff1a;先左单旋再右单旋 4. 新节点插入较高右子树的左侧-…

人工智能自然语言处理—PageRank算法和TextRank算法详解

人工智能自然语言处理—PageRank算法和TextRank算法详解 一、PageRank算法 PageRank算法最初被用作互联网页面重要性的计算方法。它由佩奇和布林于1996年提出&#xff0c;并被用于谷歌搜索引擎的页面排名。事实上&#xff0c;PageRank可以在任何有向图上定义&#xff0c;然后…

公司企业如何设计微信小程序?

​很多公司企业在制作小程序的时候都会考虑一个事情&#xff0c;就是如何设计微信小程序。有些公司企业希望把小程序设计得非常炫酷、抓人眼球。那么问题是&#xff1a;公司企业微信小程序的设计是否做得越酷炫、越抓人眼球就越好呢&#xff1f; 答案&#xff1a;非也&#xf…

基于SIFT的图像Matlab拼接教程

前言图像拼接技术&#xff0c;将普通图像或视频图像进行无缝拼接&#xff0c;得到超宽视角甚至360度的全景图&#xff0c;这样就可以用普通数码相机实现场面宏大的景物拍摄。利用计算机进行匹配&#xff0c;将多幅具有重叠关系的图像拼合成为一幅具有更大视野范围的图像&#x…

(一)Spring源码解析:容器的基本实现

一、Spring的整体架构 Spring的整体架构图如下所示&#xff1a; 二、容器的基本实现 2.1> 核心类介绍 2.1.1> DefaultListableBeanFactory DefaultListableBeanFactory是整个bean加载的核心部分&#xff0c;是Spring注册及加载bean的默认实现。 XmlBeanFactory集成自…

【FLASH存储器系列十四】固态硬盘结构和FTL初探

固态硬盘是一种典型的nand flash产品应用。与传统硬盘相化&#xff0c;固态硬盘内部没有移动的机械磁头&#xff0c;而是由固态电子存储芯片&#xff08;闪存芯片&#xff09;阵列级联组成&#xff0c;下图给出了固态硬盘的内部组成。现阶段&#xff0c;几乎所有基于闪存的固态…

ASP.NET Core+Element+SQL Server开发校园图书管理系统(三)

随着技术的进步&#xff0c;跨平台开发已经成为了标配&#xff0c;在此大背景下&#xff0c;ASP.NET Core也应运而生。本文主要基于ASP.NET CoreElementSql Server开发一个校园图书管理系统为例&#xff0c;简述基于MVC三层架构开发的常见知识点&#xff0c;前两篇文章简单介绍…

Nvidia深度学习环境安装

深度学习大型模型训练和部署&#xff0c;需要使用GPU&#xff0c;使用Pytorch、Tensorflow等深度学习框架之前需要安装驱动环境,本文系统环境&#xff1a;ubuntu22.04系统&#xff0c;四张3090显卡安装显卡驱动下载&#xff1a;选择显卡类型&#xff0c;下载驱动驱动下载路径&a…

Wireshark解析协议不匹配

Wireshark解析协议不匹配 1、问题 现有TLS/SSL over TCP的客户端、服务端相互通信&#xff0c;其中&#xff0c;服务端监听TCP端口6000。 使用tcpdump抓包6000端口&#xff0c;生成pcap文件6000.pcap&#xff1a; 使用Wireshark打开6000.pcap&#xff0c;显示如下&#xff1…

Hive(番外):Hive可视化工具IntelliJ IDEA

1 Hive CLI、Beeline CLI Hive自带的命令行客户端 优点&#xff1a;不需要额外安装 缺点&#xff1a;编写SQL环境恶劣&#xff0c;无有效提示&#xff0c;无语法高亮&#xff0c;误操作几率高 2 文本编辑器 Sublime、Emacs 、EditPlus、UltraEdit、Visual Studio Code等 有…

基于Seam Carving实现图像的重定位 附完整代码

相比于算法目标的复杂&#xff0c;算法步骤却异常的简单&#xff0c;下面具体介绍利用 SeamCarving 算法进行图像剪裁的步骤&#xff1a;1.计算图像中每个像素的“重要程度”&#xff08;能量&#xff09;&#xff0c;生成能量图。在绝大多数情况下&#xff0c;我们可以做出如下…

【string 类的使用方法(总结)】

1. 为什么学习string类&#xff1f; C语言中&#xff0c;字符串是以\0结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列的库函数&#xff0c;但是这些库函数与字符串是分离开的&#xff0c;不太符合OOP的思想&#xff0c;而且底层空间需要…