#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_startButton_clicked()
{
// 获取界面输入的端口号
quint16 port = ui->PortLineEdit->text().toUInt();
// 设置服务器为监听状态: 监听任意客户端(主机)
int ret = server->listen(QHostAddress::Any, port);
if(ret == true)
{
QMessageBox::information(this, "", "启动服务器成功");
}
else
{
QMessageBox::information(this, "", "启动服务器失败");
return;
}
// 新客户端连接信号 连接 槽函数
connect(server, &QTcpServer::newConnection, this, &Widget::connectSlot);
}
void Widget::connectSlot()
{
// 获取新连接客户端的socket
QTcpSocket *clientSocket = server->nextPendingConnection();
// 将客户端socket对象存入链表中
socketList.push_back(clientSocket);
// 客户端发送数据信号 连接 窗口
connect(clientSocket, &QTcpSocket::readyRead, this, &Widget::readySlot);
}
void Widget::readySlot()
{
int ret;
// 遍历客户端链表,移除无效客户端
for(int i = 0; i < socketList.count(); ++i)
{
ret = socketList.at(i)->state();
if(ret == QTcpSocket::UnconnectedState)
{
socketList.removeAt(i);
}
}
// 遍历客户端链表,判断哪个客户端发送了消息
for(int i = 0; i < socketList.count(); ++i)
{
// 会阻塞等待
ret = socketList.at(i)->bytesAvailable();
if(ret > 0)
{
// 读取数据
QByteArray msg = socketList.at(i)->readAll();
// 将读取到的数据发送到窗口
ui->listWidget->addItem(QString::fromLocal8Bit(msg));
// 将数据广播给所有客户端(除了发送此消息的客户端)
for(int j = 0; j < socketList.count(); ++j)
{
if(i == j)continue;
socketList.at(j)->write(msg);
}
}
}
}
C++ day5
2301_814021362024-06-20 2:05
相关推荐
众拾达人几秒前
Android自动化测试实战 Java篇 主流工具 框架 脚本皓木.3 分钟前
Mybatis-Plus不良人天码星3 分钟前
lombok插件不生效源码哥_博纳软云25 分钟前
JAVA同城服务场馆门店预约系统支持H5小程序APP源码学会沉淀。33 分钟前
Docker学习ragnwang1 小时前
C++ Eigen常见的高级用法 [学习笔记]西猫雷婶1 小时前
python学opencv|读取图像(二十一)使用cv2.circle()绘制圆形进阶kiiila1 小时前
【Qt】对象树(生命周期管理)和字符集(cout打印乱码问题)小_太_阳1 小时前
Scala_【2】变量和数据类型直裾2 小时前
scala借阅图书保存记录(三)