qt作业day5

//客户端,#include "tcpcli.h"
#include "ui_tcpcli.h"TcpCli::TcpCli(QWidget *parent) :QWidget(parent),ui(new Ui::TcpCli)
{ui->setupUi(this);//给客户端指针实例化对象cli_sock = new QTcpSocket(this);ui->discntBtn->setEnabled(false);
//    ui->lineEdit->setEnabled(false);ui->pushButton->setEnabled(false);connect(cli_sock,&QTcpSocket :: connected,this,&TcpCli :: connected_slot);connect(cli_sock,&QTcpSocket :: readyRead,this,&TcpCli :: readyRd_slot);connect(cli_sock,&QTcpSocket :: disconnected,this,&TcpCli :: disconnected_slot);
}TcpCli::~TcpCli()
{delete ui;
}//重写键盘事件
void TcpCli::keyPressEvent(QKeyEvent *event)
{if(event->text() == "\r"){if(connectState != 1){QMessageBox :: critical(this,"错误","未连接服务器");return;}if(ui->lineEdit->text() == ""){QMessageBox :: warning(this,"警告","输入不能为空");return;}QString msg = usr_name + ":" + ui->lineEdit->text();cli_sock->write(msg.toLocal8Bit());ui->lineEdit->clear();}
}//连接服务器
void TcpCli::on_connectBtn_clicked()
{//获取ui界面的信息usr_name = ui->usrNameEdit->text();QString hostName = ui->ipEdit->text();quint16 port = ui->portEdit->text().toUInt();cli_sock->connectToHost(hostName,port);}void TcpCli::connected_slot()
{ui->ipEdit->setEnabled(false);ui->portEdit->setEnabled(false);ui->pushButton->setEnabled(true);ui->connectBtn->setEnabled(false);ui->usrNameEdit->setEnabled(false);ui->discntBtn->setEnabled(true);QMessageBox :: information(this,"信息","连接服务器成功");connectState = 1;//向服务器发送信息QString msg = usr_name + ":进入聊天室";cli_sock->write(msg.toLocal8Bit());}//关于readyRead信号对应槽函数的实现
void TcpCli::readyRd_slot()
{//读取该客户端中的数据QByteArray msg = cli_sock->readAll();ui->listWidget->addItem(QString :: fromLocal8Bit(msg));}//
void TcpCli::on_pushButton_clicked()
{QString msg = usr_name + ":"+ ui->lineEdit->text();cli_sock->write(msg.toLocal8Bit());//将消息编辑框中的内容清空ui->lineEdit->clear();}//断开连接按钮对应的槽函数
void TcpCli::on_discntBtn_clicked()
{//准备要发送的信息QString sndmsg = usr_name + ":离开聊天室";cli_sock->write(sndmsg.toLocal8Bit());cli_sock->disconnectFromHost();ui->ipEdit->setEnabled(true);ui->portEdit->setEnabled(true);ui->usrNameEdit->setEnabled(true);ui->connectBtn->setEnabled(true);ui->discntBtn->setEnabled(false);ui->pushButton->setEnabled(false);connectState = 0;}void TcpCli::disconnected_slot()
{QMessageBox :: information(this,"退出","断开成功");
}
//服务器,源文件
#include "tcpser.h"
#include "ui_tcpser.h"TcpSer::TcpSer(QWidget *parent) :QWidget(parent),ui(new Ui::TcpSer)
{ui->setupUi(this);//给服务器指针实例化对象server = new QTcpServer(this);speech = new QTextToSpeech(this);}TcpSer::~TcpSer()
{delete ui;
}//启动服务器按钮对应的槽函数
void TcpSer::on_pushButton_clicked()
{//获取ui界面上的端口号quint16 port = ui->lineEdit->text().toUInt();if(!server->listen(QHostAddress :: Any,port)){QMessageBox :: critical(this,"错误","服务器启动失败",QMessageBox :: Ok,QMessageBox :: Ok);return;}else{QMessageBox :: information(this,"信息","启动成功");connect(server,&QTcpServer :: newConnection,this,&TcpSer :: newCnt_slot);}}//自定义处理newConnection信号的槽函数实现
void TcpSer::newCnt_slot()
{speech->setVoice(QVoice());speech->say("咳咳咳");QTcpSocket *sock = server->nextPendingConnection();cli_list.push_back(sock);connect(sock,&QTcpSocket :: readyRead,this,&TcpSer :: rdyRead_slot);
}//
void TcpSer::rdyRead_slot()
{//删除客户端链表中的无效客户端套接字for(int i = 0;i < cli_list.size();i++){//判断套接字的状态if(0 == cli_list[i]->state()){cli_list.removeAt(i);}}for(int i = 0;i < cli_list.count();i++){if(cli_list[i]->bytesAvailable() != 0){QByteArray msg = cli_list[i]->readAll();//将数据展示到ui界面上ui->listWidget->addItem(QString :: fromLocal8Bit(msg));//将接收到的信息发送给所有客户端for(int j = 0;j < cli_list.count();j++){cli_list[j]->write(msg);}}}}

运行效果:服务器端,开启后

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

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

相关文章

HCIA自学笔记01-冲突域

共享式网络&#xff08;用同一根同轴电缆通信&#xff09;中可能会出现信号冲突现象。 如图是一个10BASE5以太网&#xff0c;每个主机都是用同一根同轴电缆来与其它主机进行通信&#xff0c;因此&#xff0c;这里的同轴电缆又被称为共享介质&#xff0c;相应的网络被称为共享介…

Prometheus+Grafana可视化监控【主机状态】

文章目录 一、介绍二、安装Prometheus三、安装Grafana四、Pronetheus和Grafana相关联五、监控服务器状态六、常见问题 一、介绍 Prometheus是一个开源的系统监控和报警系统&#xff0c;现在已经加入到CNCF基金会&#xff0c;成为继k8s之后第二个在CNCF托管的项目&#xff0c;在…

【pytest】tep环境变量、fixtures、用例三者之间的关系

tep是一款测试工具&#xff0c;在pytest测试框架基础上集成了第三方包&#xff0c;提供项目脚手架&#xff0c;帮助以写Python代码方式&#xff0c;快速实现自动化项目落地。 在tep项目中&#xff0c;自动化测试用例都是放到tests目录下的&#xff0c;每个.py文件相互独立&…

springboot项目配置flyway菜鸟级别教程

1、Flyway的工作原理 Flyway在第一次执行时&#xff0c;会创建一个默认名为flyway_schema_history的历史记录表&#xff0c;这张表会用来跟踪或记录数据库的状态&#xff0c;然后每次项目启动时都会自动扫描在resources/db/migration下的文件的版本号并且通过查询flyway_schem…

九安监控初始化后恢复案例

九安监控是国内一个十六线小安防品牌&#xff0c;目前CHS零壹视频恢复程序监控版、专业版、高级版是支持这个安防品牌的&#xff0c;不过下边这个案例比较特殊&#xff0c;具体情况如下。 故障存储:希捷4T监控专用硬盘 故障现象: 客户描述是使用了初始化操作&#xff0c;正常…

LeetCode //C - 114. Flatten Binary Tree to Linked List

114. Flatten Binary Tree to Linked List Given the root of a binary tree, flatten the tree into a “linked list”: The “linked list” should use the same TreeNode class where the right child pointer points to the next node in the list and the left child …

游戏发行平台都有什么服务和功能?

游戏发行平台通常提供一系列服务和功能&#xff0c;以帮助游戏开发商将游戏推向市场&#xff0c;并为玩家提供游戏。以下是一些常见的游戏发行平台服务和功能&#xff1a; 1、游戏发布 发行平台允许游戏开发商将游戏上传到平台上&#xff0c;以供玩家下载和安装。 2、游戏销售…

Redis7--基础篇1(概述,安装、卸载及配置)

1. Redis概述 1.1 什么是Redis Redis&#xff1a;REmote Dictionary Server&#xff08;远程字典服务器&#xff09; Remote Dictionary Server(远程字典服务)是完全开源的&#xff0c;使用ANSIC语言编写遵守BSD协议&#xff0c;是一个高性能的Key-Value数据库提供了丰富的数…

Python 操作 CSV

使用过 CSV 文件都知道&#xff1a;如果我们的电脑中装了 WPS 或 Microsoft Office 的话&#xff0c;.csv 文件默认是被 Excel 打开的&#xff0c;那么什么是 CSV 文件&#xff1f;CSV 文件与 Excel 文件有什么区别&#xff1f;如何通过 Python 来操作 CSV 文件呢&#xff1f;带…

mfc 浮动窗口

参考 MFC模拟360悬浮窗加速球窗口

Codeforces Round 895 (Div. 3) A ~ F

Dashboard - Codeforces Round 895 (Div. 3) - Codeforces A 问多少次能使a 和 b相等&#xff0c;就是abs(a - b) / 2除c向上取整&#xff0c;也就是abs(a - b)除2c向上取整。 #include<bits/stdc.h> #define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); #de…

卡尔曼滤波公式推导(总结)

假设 小车在t时刻的初始状态可以用Pt&#xff08;当前位置&#xff09;&#xff0c;Vt&#xff08;当前速度&#xff09;&#xff0c;Ut表示加速度&#xff1a; 预测&#xff1a; 利用上一个时刻的旧状态和系统的动量模型&#xff08;如加速度&#xff0c;速度等&#xff09;…