十月四日作业

news/2024/12/22 16:08:39/

1、服务器

头文件:

#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_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_switchBtn_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_switchBtn_clicked()
{if(ui->switchBtn->text()=="启动"){quint16 port=ui->portEdit->text().toUInt();    //获取ui界面上的端口号//监听客户端的连接请求if(!server->listen(QHostAddress::Any,port)){QMessageBox::information(this,"失败","监听失败");return;}else{QMessageBox::information(this,"成功","服务器启动成功");}//将按钮文本内容改成"关闭"ui->switchBtn->setText("关闭");}else{if(server->isListening()){server->close();ui->switchBtn->setText("启动");}}
}//自定义处理newConnection信号的槽函数的实现
void Widget::newConnection_slot()
{qDebug()<<"您有新的客户端发来连接请求";//获取最新连接的客户端套接字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();
}

现象:

2、客户端

头文件:

#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 disconnected_slot();       //自定义处理disconnected信号的槽函数的声明void on_sendBtn_clicked();void on_disconnectBtn_clicked();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.ppmy.cn/news/1136642.html

相关文章

Flutter笔记:build方法、构建上下文BuildContext解析

Flutter笔记 build 方法解析 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details/133556333 本文主要介绍Flu…

WS-FLV直播协议分析

一、简介 ws-flv&#xff08;websocket-flv&#xff09;是一种直播协议&#xff0c;其基于WebSocket来传输FLV格式的音视频。可以用来替代rtmp&#xff0c;解决其需要浏览器端依赖flash的问题&#xff1b;替代http-flv&#xff0c;解决浏览器同域名请求的最大并发数限制导致的浏…

commons-lang3工具常用方法

commons-lang3是一个开源的Java类库&#xff0c;提供了一组实用工具类&#xff0c;主要用于操作字符串、日期、数值、数组等基本类型和对象。它的功能非常全面&#xff0c;几乎可以满足Java程序开发中所有涉及到的常规任务。 引入依赖 <dependency><groupId>org.ap…

使用Pytorch构建神经网络

构建神经网络的典型流程 定义一个拥有可学习参数的神经网络遍历训练数据集处理输入数据使其流经神经网络计算损失值将网络参数的梯度进行反向传播以一定的规则更新网络的权重 我们首先定义一个Pytorch实现的神经网络: # 导入若干工具包 import torch import torch.nn as nn …

MySQL数据库索引练习

1.学生表&#xff1a;Student (Sno, Sname, Ssex , Sage, Sdept) 学号&#xff0c;姓名&#xff0c;性别&#xff0c;年龄&#xff0c;所在系 Sno为主键 课程表&#xff1a;Course (Cno, Cname,) 课程号&#xff0c;课程名 Cno为主键 学生选课表&#xff1a;SC (Sno, Cno, Scor…

京东工业商品详情数据接口

京东工业品平台提供了商品详情API接口&#xff0c;通过该接口&#xff0c;可以获取商品详情信息&#xff0c;包括商品ID、名称、副标题、价格、库存、图片等相关信息。 获取京东工业品平台商品详情数据接口的具体步骤如下&#xff1a; 注册并登录京东工业品平台的API控制台&a…

文本分词排序

文本分词 在这个代码的基础上 把英语单词作为一类汉语&#xff0c;作为一类然后列出选项 1. 大小排序 2. 小大排序 3. 不排序打印保存代码 import jieba# 输入文本&#xff0c;让我陪你聊天吧~ lines [] print("请输入多行文本&#xff0c;以\"2333.3\"结束&am…

阿里云轻量应用服务器和ECS服务器有什么区别?超详细对比

阿里云服务器ECS和轻量应用服务器有什么区别&#xff1f;轻量和ECS优缺点对比&#xff0c;云服务器ECS是明星级云产品&#xff0c;适合企业专业级的使用场景&#xff0c;轻量应用服务器是在ECS的基础上推出的轻量级云服务器&#xff0c;适合个人开发者单机应用访问量不高的网站…