2024.5.10

TCP服务器端 

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

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

    //设置窗口大小和窗口大小固定
    this->resize(727,879);
    this->setFixedSize(727,879);

    //创建文本列表类对象
    list = new QListWidget(this);
    list->resize(680,550);
    list->move(20,80);

    //创建输入框
    line = new QLineEdit(this);
    line->resize(680,80);
    line->move(20,680);
    line->setPlaceholderText("请输入端口号");

    //创建发送按钮
    btn1 = new QPushButton("启动聊天室",this);
    btn1->resize(300,50);
    btn1->move(210,800);

    //创建聊天室名
    QLabel *chat_lab = new QLabel(this);
    chat_lab->resize(680,60);
    chat_lab->move(20,10);

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




    //建立信号与槽
    //按钮开启服务器
    connect(btn1,&QPushButton::clicked,this,&Widget::btn1_slot);
    connect(ser,&QTcpServer::newConnection,this,&Widget::newconnect_slot);

}

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

void Widget::btn1_slot()
{
    if(btn1->text() == "启动聊天室"){
        //开启服务器端监听

        //获取文本框内输入的端口号
        quint16 port = line->text().toUInt();
        if(ser->listen(QHostAddress::Any,port)){
            QMessageBox::information(this,"提示","启动聊天室成功");
        }else{
            QMessageBox::warning(this,"提示","启动聊天室失败");
        }
        //设置文字为关闭聊天室
        btn1->setText("关闭聊天室");
    }else{
        //关闭服务器端
        ser->close();
        //设置文字开启聊天室
        btn1->setText("启动聊天室");
    }
}

//处理信号newconnect的槽函数
void Widget::newconnect_slot()
{
    //接收客户端端口号
    QTcpSocket *socket = ser->nextPendingConnection();

    //将客户端消息存入链表
    cliList.append(socket);

    //连接客户端的信号和槽函数
    connect(socket,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);

}

//准备readyRead信号的槽函数
void Widget::readyRead_slot(){
    //判断链表中是否有客户端已经退出,有则删除
    for(int i=0;i<cliList.length();i++){
        if(cliList[i]->state() == QTcpSocket::UnconnectedState){
            cliList.removeAt(i);
        }

        //判断链表中是否有消息
        for(int i=0;i<cliList.length();i++){
            if(cliList[i]->bytesAvailable() != 0){
               QByteArray msg = cliList[i]->readAll();

               //将读取到的消息发送到ui界面
               list->addItem(QString::fromLocal8Bit(msg));

               //将读取到的消息发送给客户端
               for(int j=0;j<cliList.length();j++){
                   if(j!=i){
                       cliList[j]->write(msg);
                   }
               }
            }
        }
    }
}







 

客户端 

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

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //设置窗口大小和窗口大小固定
    this->resize(727,879);
    this->setFixedSize(727,879);

    //创建文本列表类对象
    list = new QListWidget(this);
    list->resize(500,550);
    list->move(20,80);

    //创建输入框
    text = new QTextEdit(this);
    text->resize(500,100);
    text->move(20,680);

    //创建发送按钮
    btn1 = new QPushButton("发送",this);
    btn1->resize(120,50);
    btn1->move(400,800);

    //实例化链接按钮
    link_btn = new QPushButton("连接服务器",this);
    link_btn->resize(150,60);
    link_btn->move(530,570);

    //实例化文本
    lab1 = new QLabel("用户名",this);
    lab1->resize(150,50);
    lab1->move(530,80);
    lab1->setText("用户名");

    line1 = new QLineEdit(this);
    line1->resize(150,60);
    line1->move(530,150);

    lab2 = new QLabel("IP地址",this);
    lab2->resize(150,50);
    lab2->move(530,230);
    lab2->setText("IP地址");

    line2 = new QLineEdit(this);
    line2->resize(150,60);
    line2->move(530,300);

    lab3 = new QLabel("端口号",this);
    lab3->resize(150,50);
    lab3->move(530,380);


    line3 = new QLineEdit(this);
    line3->resize(150,60);
    line3->move(530,450);


    //接收聊天室名的标签
    chat_lab = new QLabel(this);
    chat_lab->resize(500,80);


    //实例化客户端对象
    cli = new QTcpSocket(this);

    //链接函数
    connect(btn1,&QPushButton::clicked,this,&Widget::chat_btn_slot);
    connect(link_btn,&QPushButton::clicked,this,&Widget::link_btn_slot);


    connect(cli,&QTcpSocket::connected,this,&Widget::connected_slot);
    connect(cli,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);


}

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

void Widget::chat_btn_slot()
{
    //发送消息
    QString msg = userName + ":" + text->toPlainText();

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

    //清空
    text->clear();
    //发给自己的ui
    QListWidgetItem *item = new QListWidgetItem(msg);
    item->setTextAlignment(Qt::AlignRight);
    list->addItem(item);
}

void Widget::link_btn_slot()
{
    if(link_btn->text() == "连接服务器"){
        //连接服务器
        userName = line1->text();

        QString ip = line2->text();

        quint16 port = line3->text().toUInt();

        cli->connectToHost(ip,port);


        //设置文字为断开
        link_btn->setText("断开服务器");
    }else{
        //断开服务器
        QString msg = userName + ": 已下线";

        cli->write(msg.toLocal8Bit());
        cli->disconnectFromHost();

        //设置文字为连接
        link_btn->setText("连接服务器");
    }

}

void Widget::connected_slot(){
    QMessageBox::information(this,"提示","连接成功");
}

void Widget::readyRead_slot(){
    //接收到服务器端消息
    QString msg = cli->readAll();
    list->addItem(msg.toLocal8Bit());

}

 

 数据库实现

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

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

    //设置窗口大小
    this->resize(700,700);

    //设置按钮1,2,3,4
    btn1 = new QPushButton("增加",this);
    btn1->resize(120,80);
    btn1->move(100,200);

    btn4 = new QPushButton("查看",this);
    btn4->resize(120,80);
    btn4->move(500,200);

    //设置文本框输入学号和姓名
    line1 = new QLineEdit(this);
    line1->resize(150,80);
    line1->move(100,100);

    line2 = new QLineEdit(this);
    line2->resize(150,80);
    line2->move(350,100);

    //实例化表格
    table = new QTableWidget(this);
    table->resize(400,300);
    table->move(150,300);

    table->setRowCount(5);
    table->setColumnCount(2);

    //判断当前数据库操作对象是否包含了数据库
    if(!db.contains("mydb.db")){
        db = QSqlDatabase::addDatabase("QSQLITE");

        //给数据库设置名字
        db.setDatabaseName("mydb.db");

        //打开数据库
        if(!db.open()){
            QMessageBox::information(this,"提示","数据库打开失败");
        }
    }
    //准备sql语句
    QString sql = "create table if not exists Stu(numb int,name char)";

    QSqlQuery query;
    if(!query.exec(sql)){
        QMessageBox::information(this,"提示","创建数据表失败");
    }


    connect(btn1,&QPushButton::clicked,this,&Widget::sql_slot);
    connect(btn4,&QPushButton::clicked,this,&Widget::sql_slot2);

}

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


//相应按钮1,存入数据表槽函数
void Widget::sql_slot()
{
    //准备sql语句
    //将ui界面上的相关消息拿下来
    int ui_numb = line1->text().toUInt();
    QString ui_name = line2->text();

    if(ui_numb == 0 || ui_name == NULL){
        QMessageBox::information(this,"提示","请填写完整");
        return ;
    }
    QString sql = QString("insert into Stu values(%1,'%2')")
            .arg(ui_numb).arg(ui_name);
    QSqlQuery query;
    if(query.exec(sql)){
        QMessageBox::information(this,"","成功0");
    }else{
        QMessageBox::information(this,"","失败");
    }
}


//相应按钮2,查看数据库槽函数
void Widget::sql_slot2()
{
    QString sql;
    if(line2->text() ==NULL){
        sql = "select * from Stu";
    }else{
        sql = QString("select * from Stu where name = '%1'").arg(line2->text());
    }

    QSqlQuery query;
    if(!query.exec(sql)){
        QMessageBox::information(this,"","失败");
    }

    //将结果展示到ui
    int i=0;
    while(query.next()){
        for(int j=0;j<query.record().count();j++){
            QTableWidgetItem *item = new QTableWidgetItem(query.record().value(j).toString());
            table->setItem(i,j,item);
        }
        i++;
    }
}










 

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

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

相关文章

泰尔指数和泰尔指数模型:代码、案例及复现

泰尔指数模型是衡量个人或地区收入差距的重要工具。参考朱红根&#xff08;2023年&#xff09;老师的方法&#xff0c;《农业经济问题》使用泰尔指数分析了中国不同地区数字乡村发展水平的差异。该资料包括了Stata全流程代码、案例数据、参考文献&#xff0c;并提供了Excel计算…

解决mybatis的配置文件没代码提示的问题

1.将org.apache.ibatis.builder.xml包里的两个dtd文件复制出来&#xff0c;jar包里复制 2.复制dtd的url地址&#xff1a; http://mybatis.org/dtd/mybatis-3-mapper.dtd 一样的做法&#xff01; 3.关闭两个配置文件&#xff0c;重新打开&#xff0c;就可以有代码提示了&…

【Linux】Linux——Centos7安装Tomcat

1.下载Tomcat 安装包 官网地址&#xff1a;Apache Tomcat - Apache Tomcat 9 Software Downloadshttps://tomcat.apache.org/download-90.cgi 2.将下载的安装包上传到 Xftp 上&#xff0c;我是直接放到 usr 下了 3.将安装包解压到 /usr/local/ tar -zxvf apache-tomcat-9.0.8…

Java入门——类和对象(上)

经读者反映与笔者考虑&#xff0c;近期以及往后内容更新将主要以java为主&#xff0c;望读者周知、见谅。 类与对象是什么&#xff1f; C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题。 JAVA是基于面向对…

c++:(map和set的底层简单版本,红黑树和AVL树的基础) 二叉搜索树(BST)底层和模拟实现

文章目录 二叉搜索树的概念二叉搜索树的操作二叉搜索树的查找find 二叉搜索树的模拟实现构造节点insertfinderase(细节巨多,面试可能会考)a.叶子节点b.有一个孩子左孩子右孩子 c.有两个孩子注意: erase代码 中序遍历 二叉搜索树的应用k模型k模型模拟实现的总代码 k-value模型k-…

Python语言基础学习(上)

目录 一、常量和表达式 二、变量和类型 2.1 认识变量 2.2 定义变量 2.3 变量类型 1、整数 int 2、浮点数&#xff08;小数&#xff09;float 3、字符串 str 4、布尔类型 2.4 类型转换 三、注释 3.1 单行注释 3.2 文档注释&#xff08;或者多行注释&#xff09; …

Java解决垂直鉴权问题(对垂直权限进行校验)

Java解决垂直鉴权问题&#xff08;对垂直权限进行校验&#xff09; 文章目录 Java解决垂直鉴权问题&#xff08;对垂直权限进行校验&#xff09;前言一、垂直鉴权是什么&#xff1f;二、实现过程1.新建接口权限菜单映射表2.项目初始化时加载接口菜单映射关系3.自定义过滤器拦截…

【LLM 论文】Chain-of-Verification:通过验证链来减少 LLM 幻觉

论文&#xff1a;Chain-of-Verification Reduces Hallucination in Large Language Models ⭐⭐⭐ arXiv:2309.11495 论文速读 LLM 由于不可避免地会产生幻觉&#xff0c;现有的研究主要鼓励 LLM 在产生 response 之前生成内部思想的推理链&#xff0c;或者通过 self-critique…

使用leafletjs实现地图洋流、风场气象6要素地图标注、等值面图

前期实现的功能由于数据失效无法显示效果&#xff0c;今天重新对接一个数据源进行展示&#xff0c;实现效果如下图&#xff1a; 访问地址&#xff1a;可视化三维 GIS 特效 - 沉浸式视觉体验呈现令人惊叹的三维 GIS 特效&#xff0c;提供沉浸式视觉体验。https://www.wheart.cn/…

HTTP有哪些失败原因?怎么处理?

在我们日常的网络活动中&#xff0c;http协议是不可或缺的&#xff0c;它负责在互联网上传输数据。然而&#xff0c;在使用HTTP协议进行数据传输时&#xff0c;我们可能会遇到一些失败的情况。这些失败的原因多种多样&#xff0c;包括但不限于服务器问题、网络问题、客户端问题…

RobbitMQ基本消息队列的消息发送过程

RabbitMQ: One broker to queue them all | RabbitMQ RabbitMQ官网 SpringAmqp的官方地址&#xff1a;Spring AMQP 代码示例:对着代码看应该能看明白 publisher:消息发送者的代码示例 package cn.itcast.mq.helloworld;import com.rabbitmq.client.Channel; import com.rabb…

Agent AI智能体的未来:无限可能

文章目录 终结者智能体正反影响自我意识开放心态 终结者 还记得那场人类与天网之间的史诗般的战斗吗&#xff1f;-- 《终结者》系列电影。 《终结者》系列电影是一部标志性的科幻动作系列&#xff0c;以紧张刺激的情节、令人难忘的角色和开创性的视觉效果而闻名。 电影探讨了…

中国地形可调节高度-UE5-UE4

2000坐标系&#xff0c;可进行高度调整。 支持版本4.21-5.4版本 下载位置&#xff1a;https://mbd.pub/o/bread/ZpWZm5Zs

数据库基础语法二

一、数据库 1、登陆数据库 2、创建数据库zoo 3、修改数据库zoo字符集为gbk 4、选择当前数据库为zoo 5、查看创建数据库zoo信息 6、删除数据库zoo mysql -uroot -p #登陆数据库 create database zoo; #创建数据库zoo alter database zoo character set gbk collate gbk_…

rbac权限和多级请假设计的流程演示和前端页面实现

登录账号&#xff1a;t6普通用户 t7部门经理 m8总经理 密码都为&#xff1a;test 多级请假&#xff1a;7级及以下申请请假需要部门经理审核&#xff0c;若是请假时长超过72小时&#xff0c;则需要总经理审核&#xff0c;7级申请请将需要总经理审核&#xff0c;总经理请假自动审…

kubernetes删除命名空间下所有资源

kubernetes强制删除命名空间下所有资源 在 Kubernetes 中&#xff0c;当一个命名空间处于 Terminating 状态但不会完成删除过程时&#xff0c;通常是因为内部资源没有被正确清理。要强制删除这个命名空间及其所有资源&#xff0c;你可以采取以下步骤&#xff1a; 1. 确认命名空…

Linux应用(四)——系统IO函数

本节学习linux系统中常见的IO函数&#xff0c;讲解及其基本用法&#xff1b; 一、 open/close函数 open函数作用:系统调用open函数&#xff0c;打开指定路径的文件&#xff1b; int open(const char *pathname, int flags&#xff09;&#xff1b;打开一个存在的文件&#xff1…

OpenNJet,够轻更强云原生应用引擎

前言&#xff1a; 在正式介绍OpenNJet之前&#xff0c;我们先来看看它的技术架构&#xff0c;如下图所示&#xff0c;OpenNJet正是NGINX的Pro版&#xff0c;在100%兼容NGINX基础上&#xff0c;新增了动态配置加载、主动式健康检测、集群高可用、声明式API等多种强大功能。 NGIN…

第十一讲:指针(3)

第十一讲&#xff1a;指针&#xff08;3&#xff09; 1.字符指针变量1.1存储一个字符1.2存储一个字符串1.3一个有趣的面试题 2.数组指针变量2.1什么是数组指针变量2.2数组指针变量的初始化 3.二维数组传参的本质4.函数指针变量4.1介绍函数指针变量4.2 两段有趣的代码4.2.1代码1…

华为 Huawei 交换机 配置 Dot1q 终结子接口实现同设备 VLAN 间通信示例

组网需求 企业的不同部门拥有相同的业务&#xff0c;如上网、 VoIP 等业务&#xff0c;且各个部门中的用户位于不同的网段。目前存在不同的部门中相同的业务所属的VLAN 不相同&#xff0c;现需要实现不同VLAN中的用户相互通信。 如 图 7-7 所示&#xff0c;部门 1 和部门 2 中…
最新文章