10月4日作业

server

#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_startbtn_clicked()
{quint16 port = ui->portEdit->text().toUInt();//监听客户端的连接请求//函数原型bool listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0);//参数1:要监听的主机地址,如果是any表示监听任意的主机地址,也可以是特定的主机地址//参数2:该服务器的端口号,如果是0,表示由服务器自动指定,一般由程序员指定//返回值:成功进入监听,返回true,其他情况,返回falseif(!server->listen(QHostAddress::Any, port)){QMessageBox::information(this, "失败", "监听失败");return;}else{QMessageBox::information(this, "成功", "服务器监听成功");}//此时,服务器已经成功进入监听状态,如果有客户端向服务器发来连接请求//那么该服务器,就会自动发射一个newconnection的信号,我们可以将该信号连接到对应的槽函数中执行相关函数//由于只要连接一次,所以可以将该连接放在构造函数中完成
}
//自定义处理newConnection的槽函数的实现
void Widget::newConnection_slot()
{qDebug()<<"您有";QTcpSocket *s = server->nextPendingConnection();//将套接字放入客户端容器中clientList.push_back(s);//至此,多个客户端已经跟服务器建立连接,并放入容器中了//此时,如果有客户端向服务器发来数据,那么对应的客户端套接字就会自动发射一个readyread信号//我们可以将该信号连接到自定义的槽函数中,处理相关逻辑connect(s, &QTcpSocket::readyRead, this, &Widget::readyRead_solt);
}
//处理readyRead信号的槽函数的声明
void Widget::readyRead_solt()
{qDebug()<<"有新的客户端";//遍历客户端链表,将无效的客户端移除for(int i=0; i<clientList.size(); i++){//判断当前套接字是否有效连接if(clientList[i]->state() == 0){    //如果是0,表示该套接字是无效连接//将该套接字移出链表clientList.removeAt(i);}}for(int i=0; i<clientList.size(); i++){//求当前客户端套接字中待读字节的字节数//返回值:待读数据的字节数,如果等于0,表示无数据待读if(clientList[i]->bytesAvailable()){//将数据读出来QByteArray msg = clientList[i]->readAll();//将数据展示到ui界面ui->msgWidget->addItem( QString::fromLocal8Bit(msg));//将接收到的数据,转发给所有客户端for (int j=0; j<clientList.size(); j++) {clientList[i]->write(msg);}}}
}

client

#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);//服务器向客户端发消息,客户端收到后会发送readyread信号,自定义槽函数接收connect(socket, &QTcpSocket::readyRead, this, &Widget::readyread_slot);//当成功与服务器断开连接后,该客户端会自动发射一个disconnected的信号connect(socket, &QTcpSocket::disconnected,this, &Widget::disconnected_slot);
}Widget::~Widget()
{delete ui;
}//连接服务器按钮对应的槽函数
void Widget::on_startButton_clicked()
{//获取用户输入的ip、username和portusername = ui->usernameEdit->text();QString ip = ui->addressEdit->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());
}void Widget::readyread_slot()
{//读取套接字中的信息QByteArray msg = socket->readAll();//将数据展示到recvListui->recvList->addItem(QString::fromLocal8Bit(msg));
}void Widget::disconnected_slot()
{QMessageBox::information(this, "退出", "退出成功");
}void Widget::on_sendbtn_clicked()
{//获取ui界面输入的内容QString msg = username + ":" + ui->sendmsgEdit->toPlainText();//发送socket->write(msg.toLocal8Bit());//清空输入框ui->sendmsgEdit->setText("");
}void Widget::on_stopButton_clicked()
{QString msg = username + "离开聊天室";socket->write(msg.toLocal8Bit());socket->disconnectFromHost();}

运行截图

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

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

相关文章

数仓使用SQL脚本在数据库中添加初始数据示例

文章目录 需要在虚拟机上开启数据库 点击确定后&#xff0c;可以点开这个连接&#xff0c;查看数据库信息 运行 init_mysql.sql 创建mall 数据库 -- 设置sql_mode set sql_mode NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES;-- 创建数据库mall create database mall;-- 切换数…

iMazing 2.17.10官方中文版含2023最新激活许可证码

iMazing 2.17.10官方中文版是一款iOS设备管理软件&#xff0c;该软件支持对基于iOS系统的设备进行数据传输与备份&#xff0c;用户可以将包括&#xff1a;照片、音乐、铃声、视频、电子书及通讯录等在内的众多信息在Windows/Mac电脑中传输/备份/管理。 iMazing 2.17.10官方中文…

多层神经网络和激活函数

多层神经网络的结构 多层神经网络就是由单层神经网络进行叠加之后得到的&#xff0c;所以就形成了层的概念&#xff0c;常见的多层神经网络有如下结构&#xff1a; 1&#xff09;输入层&#xff08;Input layer&#xff09;&#xff0c;众多神经元&#xff08;Neuron&#xff…

【多线程进阶】死锁问题

文章目录 前言1. 什么是死锁1.1 死锁的三种典型情况 2. 死锁产生的必要条件3.如何解决死锁问题总结 前言 上文锁策略中, 当谈到可重入锁和不可重入锁时, 我们引入了一个 “死锁” 的概念, 当针对一把不可重入锁进行连续两次的加锁行为时, 就会产生死锁. 本文就重点来讲解一下…

【自动化测试】测试开发工具大合集

收集和整理各种测试工具&#xff0c;自动化测试工具&#xff0c;自动化测试框架&#xff0c;觉得有帮助记得三连一下。 欢迎提交各类测试工具到本博客。 通用测试框架 JUnit: 最著名的xUnit类的单元测试框架&#xff0c;但是不仅仅可以做单元测试。TestNG: 更强大的Java测试框…

深度学习(3)---PyTorch中的张量

文章目录 一、张量简介与创建1.1 简介1.2 张量的创建 二、张量的操作2.1 张量的拼接与切分2.2 张量索引 三、张量的数学运算 一、张量简介与创建 1.1 简介 1. 张量是一个多维数组&#xff0c;它是标量、向量、矩阵的高维拓展。 2. 在张量的定义中&#xff0c;方括号用于表示张…

基于j2ee的交通管理信息系统/交通管理系统

摘 要 随着当今社会的发展&#xff0c;时代的进步&#xff0c;各行各业也在发生着变化&#xff0c;比如交通管理这一方面&#xff0c;利用网络已经逐步进入人们的生活。传统的交通管理&#xff0c;都是工作人员线下手工统计&#xff0c;这种传统方式局限性比较大且花费较多。计…

Windows下Tensorflow docker python开发环境搭建

前置条件 windows10 更新到较新的版本&#xff0c;硬件支持Hyper-V。 参考&#xff1a;https://learn.microsoft.com/zh-cn/windows/wsl/install 启用WSL 在Powershell中输入如下指令&#xff1a; dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsys…

第十七章:Java连接数据库jdbc(java和myql数据库连接)

1.进入命令行&#xff1a;输入cmd&#xff0c;以管理员身份运行 windowsr 2.登录mysql 3.创建库和表 4.使用Java命令查询数据库操作 添加包 导入包的快捷键 选择第四个 找到包的位置 导入成功 创建java项目 二&#xff1a;连接数据库&#xff1a; 第一步&#xff1a;注册驱动…

【数据结构】抽象数据类型

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 &#x1f38f;数据类型 &#x1f38f;抽象数据类型 结语 &#x1f38f;数据类型 数据类型:是指一组性质相同的值的集合及定义在此集合上的一些操作的总称. 数据类型(d…

一文读懂UTF-8的编码规则

之前写过一篇文章“一文彻底搞懂计算机中文编码”里面只是介绍了GB2312编码知识&#xff0c;关于utf8没有涉及到&#xff0c;经过查询资料发现utf8是对unicode的一种可变长度字符编码&#xff0c;所以再记录一下。 现在国家对于信息技术中文编码字符集制定的标准是《GB 18030-…

什么是JWT?深入理解JWT从原理到应用

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《ELement》。&#x1f3af;&#x1f3af; &#x1…

互联网Java工程师面试题·Dubbo篇·第一弹

目录 1、为什么要用 Dubbo&#xff1f; 2、Dubbo 的整体架构设计有哪些分层? 3、默认使用的是什么通信框架&#xff0c;还有别的选择吗? 4、服务调用是阻塞的吗&#xff1f; 5、一般使用什么注册中心&#xff1f;还有别的选择吗&#xff1f; 6、默认使用什么序列化框架&…

SoloX:Android和iOS性能数据的实时采集工具

SoloX&#xff1a;Android和iOS性能数据的实时采集工具 github地址&#xff1a;https://github.com/smart-test-ti/SoloX 最新版本&#xff1a;V2.7.6 一、SoloX简介 SoloX是开源的Android/iOS性能数据的实时采集工具&#xff0c;目前主要功能特点&#xff1a; 无需ROOT/越狱…

美团外卖优惠券小程序 美团优惠券微信小程序 自带流量主模式 带教程

小程序带举牌小人带菜谱流量主模式&#xff0c;挺多外卖小程序的&#xff0c;但是都没有搭建教程 搭建&#xff1a; 1、下载源码&#xff0c;去微信公众平台注册自己的账号 2、解压到桌面 3、打开微信开发者工具添加小程序-把解压的源码添加进去-appid改成自己小程序的 4、…

蓝桥等考Python组别九级007

第一部分&#xff1a;选择题 1、Python L9 &#xff08;15分&#xff09; 运行下面程序&#xff0c;可以输出几行“*”&#xff1f;&#xff08; &#xff09; for i in range(0, 3): for j in range(0, 5): print(*, end ) print() 2345 正确答案&#xff1a;B 2、P…

交叉编译和GCC编译器

目录 交叉编译 hello.c文件 提问 GCC编译器 GCC编译过程 GCC常用选项 编译多个文件 预处理 编译 汇编 链接 交叉编译 hello.c文件 #include <stdio.h>int main(int argc, char argv) {if(argc > 2)printf("Hello, %s!\n", argv[1]);elseprintf…

Java基于SSM的校园一卡通系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

540. 有序数组中的单一元素

链接&#xff1a; 540. 有序数组中的单一元素 代码&#xff1a; 方法一&#xff1a;全数组的二分查找 思路和算法 假设只出现一次的元素位于下标 xxx&#xff0c;由于其余每个元素都出现两次&#xff0c;因此下标 xxx 的左边和右边都有偶数个元素&#xff0c;数组的长度是奇…

《C和指针》笔记31:多维数组的数组名、指向多维数组的指针、作为函数参数的多维数组

文章目录 1. 指向多维数组的数组名2. 指向多维数组的指针3. 作为函数参数的多维数组 1. 指向多维数组的数组名 我们知道一维数组名的值是一个指针常量&#xff0c;它的类型是“指向元素类型的指针”&#xff0c;它指向数组的第1个元素。那么多维数组的数组名代表什么呢&#x…