QT(9.4)tcp通信,数据库,opencv,

作业:

1.服务器

头文件:

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QTcpSocket>//客户端头文件
#include <QMessageBox>//消息对话框头文件
#include <QTcpServer>//服务器头文件
#include <list> //链表头文件,用来存放客户端容器QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();
private slots:void newConnection_slot();//自定义处理newconnection信号的槽函数void readyRead_slot();//自定义处理readyRead信号的槽函数void on_startbtn_clicked();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);
}Widget::~Widget()
{delete ui;
}//自定义连接按钮对应的槽函数
void Widget::on_startbtn_clicked()
{//获取ui界面上的端口号,用无符号的16为整型quint16 port = ui->portEdit->text().toUInt();//将服务器设置成监听状态if(!server->listen(QHostAddress::Any,port)){//启动失败消息提示框QMessageBox::critical(this,"失败","服务器启动失败");return;}else{QMessageBox::information(this,"成功","服务器启动成功");}//此时服务器已经启动成功,将服务器设置成监听状态//当有客户端发来连接请求时,服务器就会发射一个newConnection信号//将该信号连接到对应的槽函数中处理相关逻辑connect(server,&QTcpServer::newConnection,this,&Widget::newConnection_slot);}
//处理newConnected信号的槽函数
void Widget::newConnection_slot()
{//获取最新连接的客户端的套接字QTcpSocket *s = server->nextPendingConnection();//将获取的套接字存放到客户端容器中clientList.push_back(s);//如果该套接字有数据向服务器发送,那么套接字就会发射一个readyRead信号//我们可以将该信号连接到自定义的槽函数中connect(s,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);}
//对readyRead信号对应的槽函数
void Widget::readyRead_slot()
{//遍历客户端容器中的所有客户端删除断开连接的客户端for(int i=0;i<clientList.count();i++){if(clientList[i]->state()==0){clientList.removeAt(i);//移除下标为i的客户端}}//遍历所有客户端,查看那个客户端发来数据for(int i=0;i<clientList.count();i++){//判断如果第i个客户端有待读取的数据if(clientList[i]->bytesAvailable()!=0){//读取相关数据QByteArray msg = clientList[i]->readAll();//展示到ui界面上ui->msgList->addItem(QString::fromLocal8Bit(msg));//将接收到的消息发送给所有客户端for(int j=0;j<clientList.count();j++){clientList[j]->write(msg);}}}
}

客户端:

头文件:

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QTcpSocket> //客户端头文件
#include <QMessageBox>//消息对话框类QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic: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);//如果连接服务器成功,该客户端就会发射一个connected的信号//我们可以将该信号连接到自定义的槽函数中处理相关逻辑//由于该连接只需连接一次,所以,写在构造函数中即可connect(socket,&QTcpSocket::connected,this,&Widget::connected_slot);//客户端与服务器连接成功后,如果服务器客户端发来数据,那么客户端就会//我们可以将该信号连接到自定义的槽函数中处理相关逻辑connect(socket,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);//当客户端与服务器断开连接后,该客户端就会自动发射一个disconnected信号//我们可以将该与自定义槽函数连接//由于只需要连接一次,所以将该连接写到构造函数中connect(socket,&QTcpSocket::disconnected,this,&Widget::disconnected_slot);}Widget::~Widget()
{delete ui;
}//连接服务器按钮对应的槽函数
void Widget::on_connectBtn_clicked()
{//获取ui界面的信息userName = ui->userNameEdit->text();//获取用户名QString hostName = ui->ipEdit->text(); // 获取主机地址quint16 port = ui->portEdit->text().toUInt();//获取端口号//调用函数连接到主机//函数原型:virtual void connectToHost(const QString &hostName, quint16 port)//参数1:服务器的主机地址//参数2:端口号//返回值:无socket->connectToHost(hostName,port);//如果连接服务器成功,该客户端就会发射一个connected的信号//我们可以将该信号连接到自定义的槽函数中处理相关逻辑//由于该连接只需连接一次,所以,写在构造函数中即可}
//关于处理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->msgList->addItem(QString::fromLocal8Bit(msg));
}
//发送按钮对应的槽函数
void Widget::on_sendBtn_clicked()
{//获取Ui界面中的编辑的文本内容QString m = ui->msgEdit->text();//整合要发送的信息QString msg = userName + ":" + m;//将消息发送给服务器socket->write(msg.toLocal8Bit());//将消息编辑框中的内容清空ui->msgEdit->clear();
}
//断开按钮对应的槽函数
void Widget::on_disConnectBtn_clicked()
{//准备要发送的信息QString msg = userName + ":离开聊天室";socket->write(msg.toLocal8Bit());//调用成员函数disconnectFromHost//函数原型://功能:断开客户端与服务器的链接//参数:无//返回值:无socket->disconnectFromHost();//当客户端与服务器断开连接后,该客户端就会自动发射一个disconnected信号//我们可以将该与自定义槽函数连接//由于只需要连接一次,所以将该连接写到构造函数中
}
//disconnected信号对应的槽函数
void Widget::disconnected_slot()
{QMessageBox::information(this,"退出","断开成功");
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NIFI实现JSON转SQL并插入到数据库表中

说明 本文中的NIFI是使用docker进行安装的&#xff0c;所有的配置参考&#xff1a;docker安装Apache NIFI 需求背景 现在有一个文件&#xff0c;里面存储的是一些json格式的数据&#xff0c;要求将文件中的数据存入数据库表中&#xff0c;以下是一些模拟的数据和对应的数据库…

知识蒸馏学习

知识蒸馏----教师和学生模型&#xff1a;将已训练完善的模型作为教师模型&#xff0c;通过控制“温度”从模型的输出结果中“蒸馏”出“知识”用于学生模型的训练&#xff0c;并希望轻量级的学生模型能够学到教师模型的“知识”&#xff0c;达到和教师模型相同的表现。 本质上属…

指针进阶(二)

指针进阶 5.函数指针6. 函数指针数组7. 指向函数指针数组的指针8. 回调函数案例&#xff1a;使用回调函数&#xff0c;模拟实现qsort&#xff08;采用冒泡的方式&#xff09;。案例&#xff1a;测试qsort排序结构体数据 5.函数指针 补&#xff1a; &函数名就是函数的地址 …

sql:SQL优化知识点记录(十二)

&#xff08;1&#xff09;读锁案例讲解 加读锁和写锁 查看是否上锁&#xff1a;In_use&#xff1a;变成了1 读写锁对我们数据产生哪些影响&#xff1a; 读锁&#xff1a;是共享锁&#xff0c;其他线程可以查看&#xff1a; 加了读锁&#xff1a;session1不能修改自己&#xf…

rhcsa学习3 文件

文件系统权限 有三种权限类别可应用&#xff1a;读取、写入和执行 查看文件和目录的权限及所有权 ls -l 显示有关权限和所有权的详细信息 长列表的第一个字符表示文件类型 - 表示常规文件、d 目录、l 软链接、其它字符代表硬件设备&#xff08;b和c&#xff09;或其他具有特殊用…

视频融合平台EasyCVR综合管理平台加密机授权报错invalid character是什么原因

视频融合平台EasyCVR综合管理平台具备视频融合汇聚能力&#xff0c;作为安防视频监控综合管理平台&#xff0c;它支持多协议接入、多格式视频流分发&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包…

[C++]杨辉三角

目录 题目 解题思路 代码实现 获取数字 打印函数 主函数 全部代码 运行结果 题目 给定一个非负整数numRows &#xff0c;生成「杨辉三角」的前numRows行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 解题思路 第k列的第i个数字的值第k-1列的(…

【漏洞复现】深信服科技EDR平台存在任意用户登录漏洞

漏洞描述 深信服终端检测响应平台EDR,通过云网端联动协同、威胁情报共享、多层级响应机制,帮助用户快速处置终端安全问题,构建轻量级、智能化、响应快的下一代终端安全系统。 该EDR系统存在任意用户登录漏洞&#xff0c;攻击者通过漏洞可以登录系统后台并获取服务器的敏感信息…

一次预制体丢失[XX prefab at index n is missing]的排查经历 及 【用代码查找场景中的预制体】

一、症状描述 &#xff08;1&#xff09;从【主场景】跳转【某场景】时&#xff0c;报错——预制体丢失[prefab is missing] &#xff08;2&#xff09;在编辑器单独启动该场景&#xff0c;没有报错 二、症状溯源 场景里面有预制体实例&#xff0c;但是我把预制体的资源删除…

vue2 vuex

一、Vuex 概述 Vuex 是一个 Vue 的 状态管理工具&#xff0c;状态就是数据。 大白话&#xff1a;Vuex 是一个插件&#xff0c;可以帮我们管理 Vue 通用的数据 (多组件共享的数据)。 使用场景 某个状态 在 很多个组件 来使用 (个人信息) 多个组件 共同维护 一份数据 (购物车) …

17-Sharding-jdbc

一 Sharding-JDBC介绍 1 背景 随着通信技术的革新&#xff0c;全新领域的应用层出不穷&#xff0c;数据存量随着应用的探索不断增加&#xff0c;数据的存储和计算模式无时无刻不面临着创 新。面向交易、大数据、关联分析、物联网等场景越来越细分&#xff0c;单 一数据库再也无…

MongoDB常用的比较符号和一些功能符号

比较符号 results collection.find({age: {$gt: 20}})功能符号 results collection.find({name: {$regex: ^M.*}})