国庆day5---QT实现TCP服务器客户端搭建的代码,现象

news2024/11/19 17:44:36

ser.h

#ifndef SER_H
#define SER_H

#include <QWidget>
#include<QTcpServer>    //服务器头文件
#include<QTcpSocket>    //客户端头文件
#include<QMessageBox>   //消息对话框
#include<QList>         //链表头文件

QT_BEGIN_NAMESPACE
namespace Ui { class Ser; }
QT_END_NAMESPACE

class Ser : public QWidget
{
    Q_OBJECT

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

private slots:
    void on_connectbtn_clicked();

    void newConnection_slot();  //处理newConnection信号的槽函数
    void readyRead_slot();      //处理readyRead信号的槽函数

private:
    Ui::Ser *ui;

    QTcpServer *server;             //定义服务器指针
    QList<QTcpSocket *> clientList; //定义客户端容器
};
#endif // SER_H

ser.cpp

#include "ser.h"
#include "ui_ser.h"

Ser::Ser(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Ser)
{
    ui->setupUi(this);

    server=new QTcpServer(this);    //实例化一个服务器

    connect(server,&QTcpServer::newConnection,this,&Ser::newConnection_slot);
}

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

//启动服务器按钮对应的槽函数
void Ser::on_connectbtn_clicked()
{
    quint16 port=ui->portbtn->text().toUInt();
    if(server->listen(QHostAddress::Any,port)){
        QMessageBox::information(this,"成功","服务器启动成功");
    }
    else{
        QMessageBox::information(this,"失败","服务器启动失败");
        return;
    }
}
//处理newConnection信号的槽函数
void Ser::newConnection_slot(){
    QTcpSocket *s=server->nextPendingConnection();  //获取最新连接的客户端套接字

    clientList.push_back(s);    //将套接字放入客户端链表中

    connect(s,&QTcpSocket::readyRead,this,&Ser::readyRead_slot);
}
//处理readyRead信号的槽函数
void Ser::readyRead_slot(){
    for(int i=0;i<clientList.count();i++){
        if(clientList[i]->state()==0){
            clientList.removeAt(i);
        }
    }

    for(int i=0;i<clientList.count();i++){
        if(clientList[i]->bytesAvailable()!=0){
            QByteArray msg=clientList[i]->readAll();
            ui->msgwidget->addItem(QString::fromLocal8Bit(msg));

            for(int j=0;j<clientList.count();j++){
                clientList[j]->write(msg);
            }
        }
    }
}

cli.h

#ifndef CLI_H
#define CLI_H

#include <QWidget>
#include<QTcpSocket>    //客户端头文件
#include<QMessageBox>   //消息对话框

QT_BEGIN_NAMESPACE
namespace Ui { class cli; }
QT_END_NAMESPACE

class cli : public QWidget
{
    Q_OBJECT

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

private slots:
    void on_connectbtn_clicked();
    void on_sendbtn_clicked();
    void on_disconnectbtn_clicked();

    void connected_slot();  //处理connected信号的槽函数
    void readyRead_slot();  //处理readyRead信号的槽函数
    void disconnected_slot();   //处理disconnected信号的槽函数


private:
    Ui::cli *ui;

    QTcpSocket *socket; //定义客户端指针

    QString username;   //用户名
};
#endif // CLI_H

cli.cpp

#include "cli.h"
#include "ui_cli.h"

cli::cli(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::cli)
{
    ui->setupUi(this);

    socket=new QTcpSocket(this);    //实例化一个客户端

    ui->disconnectbtn->setEnabled(false);
    ui->sendbtn->setEnabled(false);
    ui->msgedit->setEnabled(false);

    connect(socket,&QTcpSocket::connected,this,&cli::connected_slot);

    connect(socket,&QTcpSocket::readyRead,this,&cli::readyRead_slot);

    connect(socket, &QTcpSocket::disconnected, this, &cli::disconnected_slot);
}

cli::~cli()
{
    delete ui;
}
//连接服务器按钮对应的槽函数
void cli::on_connectbtn_clicked()
{
    username=ui->usernameedit->text();
    QString ip=ui->ipedit->text();
    quint16 port=ui->portedit->text().toUInt();

    socket->connectToHost(ip,port);
}
//处理connected信号的槽函数
void cli::connected_slot(){
    ui->disconnectbtn->setEnabled(true);
    ui->sendbtn->setEnabled(true);
    ui->msgedit->setEnabled(true);
    ui->usernameedit->setEnabled(false);
    ui->ipedit->setEnabled(false);
    ui->portedit->setEnabled(false);
    ui->connectbtn->setEnabled(false);
    QMessageBox::information(this,"成功","成功进入聊天室");
    QString msg=username+": 进入聊天室";

    socket->write(msg.toLocal8Bit());
}
//处理readyRead信号的槽函数
void cli::readyRead_slot(){
    QByteArray msg=socket->readAll();

    ui->msgwidget->addItem(QString::fromLocal8Bit(msg));
}
//发送信息按钮对应的槽函数
void cli::on_sendbtn_clicked()
{
    QString msg=username+": "+ui->msgedit->text();

    socket->write(msg.toLocal8Bit());

    ui->msgedit->clear();
}
//断开服务器按钮对应的槽函数
void cli::on_disconnectbtn_clicked()
{
    QString msg=username+": 离开聊天室";

    socket->write(msg.toLocal8Bit());

    socket->disconnectFromHost();
}
//处理disconnected信号的槽函数
void cli::disconnected_slot(){
    ui->disconnectbtn->setEnabled(false);
    ui->sendbtn->setEnabled(false);
    ui->msgedit->setEnabled(false);
    ui->usernameedit->setEnabled(true);
    ui->ipedit->setEnabled(true);
    ui->portedit->setEnabled(true);
    ui->connectbtn->setEnabled(true);
    QMessageBox::information(this,"退出","退出成功");
}

效果图

 

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

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

相关文章

pycharm中添加固定的作者的信息

一. pycharm中添加作者信息,日期,等 如图所示 里面还可以添加一些固定的信息 #专业 计算机科学与技术 #姓名 小明

Java泛型理解

什么是泛型&#xff1f; 我们都知道 Java 中有形参和实参之分&#xff0c;是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数&#xff0c;其本身没有确定的值。在调用函数时&#xff0c;实参将赋值给形参。 而泛型是一种参数化的类型&#xff08…

【云备份】

文章目录 [toc] 1 :peach:云备份的认识:peach:1.1 :apple:功能了解:apple:1.2 :apple:实现目标:apple:1.3 :apple:服务端程序负责功能:apple:1.4 :apple:服务端功能模块划分:apple:1.5 :apple:客户端程序负责功能:apple:1.6 :apple:客户端功能模块划分:apple: 2 :peach:环境搭建…

Cocos Creator3.8 实战问题(四)巧用九宫格图像拉伸

一、为什么要使用九宫格图像拉伸 相信做过前端的同学都知道&#xff0c;ui &#xff08;图片&#xff09;资源对包体大小和内存都有非常直接的影响。 通常ui 资源都是图片&#xff0c;也是最占资源量的资源类型&#xff0c;游戏中的ui 资源还是人机交互的最重要的部分&#xff…

【Java】main方法的深入理解

目录 深入理解 main 方法 public static void main(String[] args) ​编辑示例代码&#xff1a; 编译运行&#xff08;String[] args&#xff09;&#xff1a; main 方法的注意事项 示例代码&#xff1a; 深入理解 main 方法 public static void main(String[] args) mai…

HTTP协议,请求响应

、概述 二、HTTP请求协议 三、HTTP响应协议 四、请求数据 1.简单实体参数 RequestMapping("/simpleParam")public String simpleParam(RequestParam(name "name" ,required false ) String username, Integer age){System.out.println (username "…

基于Java的火车高铁订票购票系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

PowerShell 内网不能直接安装SqlServer模块的处理办法

PowerShell 内网不能直接安装SqlServer模块的处理办法 文章目录 下载sqlserver module安装sqlserver module导入和验证sqlserver 模块推荐阅读 下载sqlserver module 首先先将sqlserver.nupkg下载到本地&#xff0c;我是放到了C:\windows\system32目录下。 PowerShell Galler…

2023年【电工(初级)】最新解析及电工(初级)新版试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 电工&#xff08;初级&#xff09;最新解析是安全生产模拟考试一点通总题库中生成的一套电工&#xff08;初级&#xff09;新版试题&#xff0c;安全生产模拟考试一点通上电工&#xff08;初级&#xff09;作业手机同…

采访|使用过ChatGPT的同学在与人工智能对话后的体验

“我能够回答各种问题&#xff0c;包括但不限于有关互联网、科技、娱乐、教育等领域的知识。我不会感到疲倦或分心&#xff0c;也没有情绪或偏见。”这是ChatGPT对自己的描述。ChatGPT拥有从巨大语料库中学习、理解自然语言文本的强大功能。强大的对话、理解能力使得它仅仅用了…

ArcGIS Engine:报错无法嵌入互操作类型“ESRI.ArcGIS.Geometry.EnvelopeClass”。请改用适用的接口。

此错误是由于尝试直接实例化ArcGIS COM组件的某些互操作类引起的。这在.NET Framework 4及更高版本中是不被推荐的。 为了解决此问题&#xff0c;你需要确保在工程的引用中将ArcGIS的互操作类型设置为“不嵌入”。 按照以下步骤操作&#xff1a; 在解决方案资源管理器中找到…

网络爬虫指南

一、定义 网络爬虫&#xff0c;是按照一定规则&#xff0c;自动抓取网页信息。爬虫的本质是模拟浏览器打开网页&#xff0c;从网页中获取我们想要的那部分数据。 二、Python为什么适合爬虫 Python相比与其他编程语言&#xff0c;如java&#xff0c;c#&#xff0c;C&#xff…

如何使用百度“云一朵”来分析PDF文件

PDF 文件是一种常见的文件格式&#xff0c;用于存储文档、图像和其他内容。在许多情况下&#xff0c;我们需要对 PDF 文件进行分析&#xff0c;以提取其中的信息。百度“云一朵”提供了一个 PDF 分析 API&#xff0c;可以帮助我们轻松地对 PDF 文件进行分析。 在本博客文章中&…

第15届蓝桥STEMA测评真题剖析-2023年8月20日Scratch编程中级组

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第155讲。 第15届蓝桥第1次STEMA测评&#xff0c;这是2023年8月20日举办的STEMA&#xff0c;比赛仍然采取线上形式。这…

Java基础---第十五篇

系列文章目录 文章目录 系列文章目录一、红黑树有哪几个特征?二、说说你平时是怎么处理 Java 异常的三、说说深拷贝和浅拷贝?一、红黑树有哪几个特征? 紧接上个问题,面试官很有可能会问红黑树,下面把红黑树的几个特征列出来: 二、说说你平时是怎么处理 Java 异常的 try…

Ubuntu22.04 交叉编译gcc9.5 for arm

一、准备 环境&#xff1a;ubuntu22.04为刚刚安装&#xff0c;未安装gcc等包 vi ~/.bashrc输入 export PATH$PATH:/opt/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin 保存,reboot 安装&#xff1a; sudo apt install cmake sudo apt install gawk sudo apt instal…

【go语言】方法

go的方法是一种作用在接收者&#xff08;某种类型的变量&#xff0c;不能是接口和指针&#xff09;上的特殊函数 方法的声明 // 类型方法接收者是值类型 func (t TypeName) MethodName (ParamList ) (Returnlist) {//method body }// 类型方法接收者是指针 func (t *TypeName…

A股上市公司数字技术创新与企业高质量发展 企业全要素生产率-5种测算方法 2000-2022

数据简介&#xff1a;全要素生产率(TFP&#xff09;也可以称之为系统生产率。指生产单位&#xff08;主要为企业&#xff09;作为系统中的各个要素的综合生产率&#xff0c;以区别于要素生产率&#xff08;如技术生产率&#xff09;。测算公式为&#xff1a;全要素生产率产出总…

解决nvm切换node版本失败的终极办法-秒杀网上99%的水文

nvm是一款强大的node多版本管理器&#xff0c;可以轻易选择你需要的node版本&#xff0c;这对win7平台简直就是超好的福音&#xff1a;可以突破node 14.15以上的安装限制。 但是nvm安装有一个巨大的坑点&#xff1a;nvm use 版本号以后&#xff0c;并没有生效&#xff0c;nvm …