国庆10.04

news2024/10/7 8:22:34

服务器

代码

头文件

#ifndef WIDGET_H
#define WIDGET_H


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


QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE


class Widget : public QWidget
{
    Q_OBJECT


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


private slots:
    void on_startBtn_clicked();


    void newConnection_slot();          //自定义处理newConnection信号的槽函数的声明
    void readyRead_slot();              //自定义处理readyRead信号的槽函数的声明


private:
    Ui::Widget *ui;


    //定义服务器指针
    QTcpServer *server;


    //定义客户端容器
    QList<QTcpSocket *> clientList;


};
#endif // WIDGET_H

源文件

#include "widget.h"
#include "ui_widget.h"


Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //实例化一个服务器
    server = new QTcpServer(this);
    //链接信号与槽函数
    connect(server, &QTcpServer::newConnection, this, &Widget::newConnection_slot);
}
Widget::~Widget()
{
    delete ui;
}
//启动服务器按钮对应的槽函数
void Widget::on_startBtn_clicked()
{
    quint16 port = ui->portEdit->text().toUInt();    //获取ui界面上的端口号
    //监听
    if(!server->listen(QHostAddress::Any, port))
    {
        QMessageBox::information(this, "失败", "监听失败");
        return ;
    }else
    {
        QMessageBox::information(this, "成功", "服务器启动成功");
    }
}
//自定义处理newConnection信号的槽函数的实现
void Widget::newConnection_slot()
{
    //获取最新连接的客户端套接字
    QTcpSocket *s = server->nextPendingConnection();
    //将该套接字,放入客户端链表中
    clientList.push_back(s);
    //链接信号与槽函数
    connect(s, &QTcpSocket::readyRead, this, &Widget::readyRead_slot);
}
//readyRead信号对应槽函数的实现
void Widget::readyRead_slot()
{
    qDebug()<<"有新的客户端消息发来了";
    //遍历客户端链表,将无效的客户端移除
    for(int i=0; i<clientList.size(); i++)
    {
        //判断当前套接字是否是有效连接
        if(clientList[i]->state() ==0)
        {
            //将该套接字移除客户端容器
            clientList.removeAt(i);
        }
    }
    //遍历客户端链表,判断是哪个客户端发来的数据
    for(int i=0; i<clientList.size(); i++)
    {
        //功能:求当前客户端套接字中待读数据的字节数
        if(clientList[i]->bytesAvailable() != 0)
        {
            //将该套接字中的数据读取出来
            QByteArray msg = clientList[i]->readAll();
            //将数据展示到ui界面
            ui->msgWidget->addItem( QString::fromLocal8Bit(msg) );
            //将接受到的数据,转发给所有客户端
            for(int j=0; j<clientList.size(); j++)
            {
                clientList[j]->write(msg);
            }
        }
    }
}

主程序 

#include "widget.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

运行结果

客户端

代码

头文件

#ifndef WIDGET_H
#define WIDGET_H


#include <QWidget>
#include<QTcpSocket>            //客户端类
#include<QMessageBox>


QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE


class Widget : public QWidget
{
    Q_OBJECT


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


private slots:
    void on_connectBtn_clicked();
    void connected_slot();                  //自定义处理connected信号的槽函数的声明
    void readyRead_slot();                 //自定义处理readyRead信号的槽函数的声明


    void on_sendBtn_clicked();


    void on_disconnectBtn_clicked();


    void disconnected_slot();              //自定义处理disconnected信号的槽函数的声明


private:
    Ui::Widget *ui;


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


    //定义字符串接受用户
    QString userName;


};
#endif // WIDGET_H

源文件

#include "widget.h"
#include "ui_widget.h"


Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //给客户端指针实例化对象
    socket = new QTcpSocket(this);
    //链接信号与槽函数
    connect(socket, &QTcpSocket::connected, this, &Widget::connected_slot);
    connect(socket, &QTcpSocket::readyRead, this, &Widget::readyRead_slot);
    connect(socket, &QTcpSocket::disconnected, this, &Widget::disconnected_slot);
}
Widget::~Widget()
{
    delete ui;
}
//连接服务器按钮对应的槽函数
void Widget::on_connectBtn_clicked()
{
    //获取ui界面上的相关信息
    userName = ui->userNameEdit->text();         //获取用户名
    QString ip = ui->ipEdit->text();            //主机地址
    quint16 port = ui->portEdit->text().toUInt();        //端口号
    //连接服务器
    socket->connectToHost(ip, port);
}
//处理connected信号的槽函数
void Widget::connected_slot()
{
    QMessageBox::information(this, "成功", "您已经成功进入聊天室");
    //向服务器发送一条数据
    QString msg = userName +": 进入聊天室";
    socket->write(msg.toLocal8Bit());          //将数据写给服务器
}
//处理readyRead信号的槽函数的
void Widget::readyRead_slot()
{
    //读取套接字中的信息
    QByteArray msg = socket->readAll();
    //将数据展示到ui界面
    ui->msgWidget->addItem(QString::fromLocal8Bit(msg));
}
//发送按钮对应的槽函数
void Widget::on_sendBtn_clicked()
{
    //获取ui界面输入的内容
    QString msg =userName+ ": " + ui->msgEdit->text();
    //发送给服务器
    socket->write(msg.toLocal8Bit());
    //清空编辑框内容
    ui->msgEdit->clear();
}
//断开服务器按钮对应的槽函数
void Widget::on_disconnectBtn_clicked()
{
    QString msg = userName +": 离开聊天室";
    socket->write(msg.toLocal8Bit());
    //断开连接
    socket->disconnectFromHost();
}
//disconnected信号对应槽函数的定义
void Widget::disconnected_slot()
{
    QMessageBox::information(this, "提示", "退出成功");
}

 主程序 

#include "widget.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

运行结果

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

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

相关文章

数据结构与算法--算法

这里写目录标题 线性表顺序表链表插入删除算法 一级目录二级目录二级目录二级目录 一级目录二级目录二级目录二级目录 一级目录二级目录二级目录二级目录 一级目录二级目录二级目录二级目录 线性表 顺序表 链表 插入删除算法 步骤 1.通过循环到达指定位置的前一个位置 2.新建…

知网G4《基础教育论坛》期刊投稿邮箱

知网G4《基础教育论坛》期刊投稿邮箱 《基础教育论坛》文稿要求5000字符3版&#xff0c;查重率15%以下。 所有投稿必须在文后注明&#xff1a;作者姓名、性别、出生年&#xff08;如1968—&#xff09;、工作单位、通讯地址&#xff08;注明所在地及邮编&#xff09;。 对于科…

postgresql-物化视图

postgresql-物化视图 物化视图创建物化视图刷新物化视图修改物化视图删除物化视图 物化视图 创建物化视图 postgresql使用create materialized view 语句创建视图 create materialized view if not exists name as query [with [NO] data];-- 创建一个包含员工统计信息的物化…

Flink--8、时间语义、水位线(事件和窗口、水位线和窗口的工作原理、生产水位线、水位线的传递、迟到数据的处理)

星光下的赶路人star的个人主页 将自己生命力展开的人&#xff0c;他的存在&#xff0c;对别人就是愈疗 文章目录 1、时间语义1.1 Flink中的时间语义1.2 哪种时间语义更重要 2、水位线&#xff08;Watermark&#xff09;2.1 事件时间和窗口2.2 什么是水位线1.3 水位线和窗口的工…

竞赛 大数据商城人流数据分析与可视化 - python 大数据分析

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于大数据的基站数据分析与可视化 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度…

SketchUp Pro 2023 for Mac——打造你的创意之城

SketchUp Pro 2023 for Mac是一款专业级的3D建模软件&#xff0c;为你提供最佳的设计和创意工具。不论你是建筑师、室内设计师&#xff0c;还是爱好者&#xff0c;SketchUp Pro都能满足你对于创意表达的需求。 SketchUp Pro 2023拥有强大而直观的界面&#xff0c;让你轻松绘制…

关于大小端的想法

一、课本上的内容 二、一些想法 之前一直只是做题&#xff0c;不具体了解大小端存在的意义。 应用中&#xff0c;网络字节序常使用大端模式&#xff0c;主机字节序常使用小端模式。 实际上&#xff0c;计算机常使用小端模式是因为小端的加法器比较好做。就比如要做一个 4 …

C++:stl:stack、queue、priority_queue介绍及模拟实现和容量适配器deque介绍

本文主要介绍c中stl的栈、队列和优先级队列并对其模拟实现&#xff0c;对deque进行一定介绍并在栈和队列的模拟实现中使用。 目录 一、stack的介绍和使用 1.stack的介绍 2.stack的使用 3.stack的模拟实现 二、queue的介绍和使用 1.queue的介绍 2.queue的使用 3.queue的…

Docker-mysql,redis安装

安装MySQL 下载MySQL镜像 终端运行命令 docker pull mysql:8.0.29镜像下载完成后&#xff0c;需要配置持久化数据到本地 这是mysql的配置文件和存储数据用的目录 切换到终端&#xff0c;输入命令&#xff0c;第一次启动MySQL容器 docker run --restartalways --name mysq…

ROS(0)命令及学习资源汇总

ROS安装命令 参考&#xff1a;Ubuntu20.04.4安装ROS Noetic详细教程 - 知乎 安装C和Python3 sudo apt-get install g sudo apt-get install python3 ROS运行小海龟仿真器 roscore确定ROS是否运行成功rosrun turtlesim turtlesim_node运行小海龟仿真器rosrun turtlesim turtle_…

unordered_map和unordered_set模拟实现

unordered系列的关联式容器之所以效率比较高&#xff0c;是因为其底层使用了哈希结构。 一、哈希 1.1哈希概念 构造一种存储结构&#xff0c;通过某种函数(hashFunc)使元素的存储位置与它的关键码之间能够建立一一映射的关系&#xff0c;那么在查找时通过该函数可以很快找到…

十二、Django之模板的继承+用户列表

模板的继承 新建layout.html&#xff1a; {% load static %} <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><link rel"stylesheet" href"{% static plugins…

【功能设计】应用集成平台token授权接入

文章目录 IPass应用集成平台token授权接入1.接入流程图&#xff1a;2.功能设计&#xff1a;3.测试要点&#xff1a; IPass应用集成平台token授权接入 1.接入流程图&#xff1a; 功能业务流程描述&#xff1a; a.调用方从redis获取应用集成平台授权token b.如果没有拿到&…

[linux] SFTP文件传输基本命令 --- xshell 直接上传文件

2.sftp - 上传文件&#xff1a;如果上传/下载的是文件夹, 在put/get命令后加上-r参数即可。 上传文件&#xff1a; 把本地服务器的/www/wwwroot目录下面的study.log文件上传到远程服务器的/www/server目录下。 sftp> lcd /www/wwwroot sftp> put study.log /www/server…

数据结构与算法-顺序表

数据结构与算法 &#x1f388;1.线性表&#x1f50e;1.1基本操作&#x1f50e;1.2线性表的存储结构 &#x1f388;2.线性表的顺序表示和实现&#x1f50e;2.1线性表的顺序存储表示&#x1f52d;2.1.1静态顺序表&#x1f52d;2.1.2动态顺序表 &#x1f50e;2.2顺序表基本操作的实…

C/C++/VS2022/指针/数组 调试出现debug

这个情况就很难受&#xff0c;编译没错&#xff0c;但是运行出现问题了&#xff0c;如果点击中止&#xff08;重试、忽略&#xff09;下一次运行还是会出现&#xff0c;看了显示的大致意思是在数组arry上出现了什么错误&#xff0c;经过检查发现&#xff0c;原来是数组在数入时…

李沐深度学习记录2:10多层感知机

一.简要知识记录 x.numel()&#xff1a;看向量或矩阵里元素个数 A.sum()&#xff1a;向量或矩阵求和&#xff0c;axis参数可对某维度求和&#xff0c;keepdims参数设置是否保持维度不变 A.cumsum&#xff1a;axis参数设置沿某一维度计算矩阵累计和x*y:向量的按元素乘法 torch.…

【Golang】并发

并发 有人把Go语言比作 21 世纪的C语言 第一是因为Go语言设计简单 第二则是因为 21 世纪最重要的就是并发程序设计&#xff0c;而 Go 从语言层面就支持并发。同时实现了自动垃圾回收机制 先来了解一些概念&#xff1a; 进程/线程 进程是程序在操作系统中的一次执行过程&#…

MySQL锁的详细讲解(全局锁、表级锁、行级锁)

# 概述 # 全局锁 # 表级锁 表锁 元数据锁 假如有客户端1、客户端2&#xff0c; 客户端1&#xff0c;执行begin命令开启了事务 客户端1没有执行读写语句&#xff0c;这时&#xff0c;客户端执行查看元数据锁的命令&#xff0c;查看到没有加到元数据锁当客户端1执行select读操作…