#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
相关推荐
k093311 分钟前
sourceTree回滚版本到某次提交神奇夜光杯19 分钟前
Python酷库之旅-第三方库Pandas(202)Themberfue21 分钟前
Java多线程详解⑤(全程干货!!!)线程安全问题 || 锁 || synchronizedplmm烟酒僧23 分钟前
Windows下QT调用MinGW编译的OpenCV测试界的酸菜鱼34 分钟前
Python 大数据展示屏实例我是谁??34 分钟前
C/C++使用AddressSanitizer检测内存错误晨曦_子画43 分钟前
编程语言之战:AI 之后的 Kotlin 与 JavaBlack_Friend1 小时前
关于在VS中使用Qt不同版本报错的问题发霉的闲鱼1 小时前
MFC 重写了listControl类(类名为A),并把双击事件的处理函数定义在A中,主窗口如何接收表格是否被双击小c君tt1 小时前
MFC中Excel的导入以及使用步骤