网络聊天室服务器实现
//头文件#ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer>//服务器端类 #include <QMessageBox>//消息对话框类 #include <QTcpSocket>//客户端类 #include <QList>//链表容器类QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_startbtn_clicked();public slots:void newConnection_slot();void readyRead_slot();private:Ui::Widget *ui;//实例化一个服务器指针QTcpServer *server;//定义一个存放客户端套接字的容器QList<QTcpSocket *> socketList; }; #endif // WIDGET_H//源文件#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget), server(new QTcpServer(this))//给服务器指针实例化空间 {ui->setupUi(this); }Widget::~Widget() {delete ui; }//启动按钮对应的槽函数 void Widget::on_startbtn_clicked() {//获取ui界面上的端口号quint16 port = ui->PortEdit->text().toUInt();//将字符串转换成整型//让服务器设置监听if(server->listen(QHostAddress::Any,port)){QMessageBox::information(this,"","启动服务器成功!");}else{QMessageBox::information(this,"","启动服务器失败!");return;}//此时服务器已设置好监听,如果有客户端发来连接请求,那么服务器端就会自动发射一个newConnection()信号//将该信号连接到自定义的槽函数中,处理逻辑代码connect(server,&QTcpServer::newConnection,this,&Widget::newConnection_slot); }//newConnection_slot信号对应的槽函数实现 void Widget::newConnection_slot() {//使用nextpaddingConnection获取最新连接客户端的套接字//函数原型:virtual QTcpSocket *nextPendingConnection();QTcpSocket *s = server->nextPendingConnection();//将客户端放入容器中socketList.push_back(s);//程序运行至此说明服务器和客户端已经建立了连接//如果有客户端向服务器发来数据,则客户端就会自动发射一个readyRead信号,//就可以将该信号连接到自定义的槽函数中,读取数据connect(s,&QTcpSocket::readyRead,this,&Widget::readyRead_slot); }void Widget::readyRead_slot() {//遍历客户端容器,移除无效客户端for(int i=0; i<socketList.count(); i++)//count为容器的元素个数{//state函数判断连接状态//函数原型:SocketState state() const;//函数返回值,枚举值为0的表示未连接if(socketList.at(i)->state() == 0){//删除该元素socketList.removeAt(i);}}//遍历客户端容器寻找哪个客户端有数据待读for(int i=0; i<socketList.count(); i++){//函数功能:数据的字节//函数原型:qint64 bytesAvailable() const override;if(socketList.at(i)->bytesAvailable()!=0){QByteArray msg = socketList.at(i)->readAll();//将读取到的数据放入ui界面上ui->listWidget->addItem(QString::fromLocal8Bit(msg));//将数据广播给所有客户端for(int j=0; j<socketList.count(); j++){socketList.at(j)->write(msg);}}} }
6.19作业
2025/3/20 0:38:31
来源:https://blog.csdn.net/weixin_61168786/article/details/139812585
浏览:
次
关键词:6.19作业
版权声明:
本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。
我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com
热文排行
- 华为 海思22AP10(SS524)H.265 编解码处理器用户指南
- 数据库物理结构设计
- 如何在 Mac 上清空硬盘后恢复丢失的数据?
- npm install puppeteer 报错 npm ERR! PUPPETEER_DOWNLOAD_HOST is deprecated解决办法
- 基于重要抽样的主动学习不平衡分类方法ALIS
- 《缺失MRI模态下的脑肿瘤分割的潜在相关表示学习》| 文献速递-深度学习肿瘤自动分割
- (2)Django生产环境数据库的切换以及环境配置python-dotenv方案
- 【微信小程序】自定义组件 - 组件的生命周期
- 概率图模型在自然语言处理中的应用
- 大模型分离架构学习记录