当前位置: 首页 > news >正文

qt

服务器端widget.cpp

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget), tcp(new QTcpServer(this))
{ui->setupUi(this);//获取输入的端口号}
//连接成功,获取客户端套接字
void Widget::newConnection_solt()
{//打印表示有客户端连接qDebug() << "有新客户端连接";//获取套接字QTcpSocket *s = tcp->nextPendingConnection();//将获取到的套接字放入链表中socketList.push_back(s);//连接信号和槽,读取客户端发来的数据connect(s,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);
}
//读取客户端发来的数据
void Widget::readyRead_slot()
{//遍历链表for (int i = 0;i < socketList.count(); i++) {if(socketList.at(i)->state() == 0){//移除无效客户端socketList.removeAt(i);}}for (int i=0;i< socketList.count();i++) {if(socketList.at(i)->bytesAvailable()!=0){//读取全部数据QByteArray msg = socketList.at(i)->readAll();//将数据显示到ui界面ui->listWidget->addItem(QString::fromLocal8Bit(msg));socketList.at(i)->sock-for (int j = 0;j<socketList.count();j++) {socketList.at(i)->write(msg);}}}
}
Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_clicked()
{quint16 port = ui->lineEdit->text().toUInt();//监听端口号if(tcp->listen(QHostAddress::Any,port)){QMessageBox::information(this,"提示","启动服务器成功");}else{QMessageBox::information(this,"提示","启动服务器失败");return;}//获取客户端的套接字connect(tcp,&QTcpServer::newConnection,this,&Widget::newConnection_solt);
}

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QTcpServer>
#include <QMessageBox>
#include <QDebug>
#include <QList>
#include <QTcpSocket>
//#include <QListWidget>
//#include <QApplication>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();
public slots:void newConnection_solt();void readyRead_slot();
private slots:void on_pushButton_clicked();private:Ui::Widget *ui;QTcpServer *tcp;QList<QTcpSocket *> socketList;
};
#endif // WIDGET_H

客户端 widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QTcpSocket>
#include <QMessageBox>
#include <QHostAddress>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();public slots:void connected_slot();void readyRead_slot();void disconnected_slot();
private slots:void on_connectBtn_clicked();void on_pushButton_clicked();void on_disconnectBtn_clicked();private:Ui::Widget *ui;QTcpSocket *socket;QString username;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget),socket(new QTcpSocket(this))
{ui->setupUi(this);//设置初始不可用ui->lineEdit->setEnabled(false);ui->pushButton->setEnabled(false);ui->disconnectBtn->setEnabled(false);connect(socket,&QTcpSocket::connected,this,&Widget::connected_slot);//接收服务器发来的消息connect(socket,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);connect(socket,&QTcpSocket::disconnected,this,&Widget::disconnected_slot);
}
//成功连接服务器执行的槽函数
void Widget::connected_slot()
{username = ui->username->text();QString msg = username+"进入聊天室";socket->write(msg.toLocal8Bit());QMessageBox::information(this,"提示","连接服务器成功");ui->lineEdit->setEnabled(true);ui->pushButton->setEnabled(true);ui->disconnectBtn->setEnabled(true);ui->ip->setEnabled(false);ui->port->setEnabled(false);ui->username->setEnabled(false);ui->connectBtn->setEnabled(false);
}
Widget::~Widget()
{delete ui;
}
//接收服务器发来的消息
void Widget::readyRead_slot()
{QByteArray msg = socket->readAll();//将接收到的数据展示在界面ui->listWidget->addItem(QString::fromLocal8Bit(msg));
}void Widget::on_connectBtn_clicked()
{//获取输入的ip和端口号quint16 port = ui->port->text().toUInt();socket->connectToHost(ui->ip->text(),port);}
//发送消息给服务器
void Widget::on_pushButton_clicked()
{//获取文本QString msg = ui->lineEdit->text();msg = username+":"+msg;socket->write(msg.toLocal8Bit());ui->lineEdit->clear();
}
//断开连接
void Widget::on_disconnectBtn_clicked()
{QString msg = username+"离开聊天室";socket->write(msg.toLocal8Bit());//断开连接socket->disconnectFromHost();
}void Widget::disconnected_slot()
{ui->lineEdit->setEnabled(false);ui->pushButton->setEnabled(false);ui->disconnectBtn->setEnabled(false);ui->ip->setEnabled(true);ui->port->setEnabled(true);ui->username->setEnabled(true);ui->connectBtn->setEnabled(true);
}

 

 

 


http://www.mrgr.cn/news/3763.html

相关文章:

  • 【案例52】oracle进程占用CPU100%分析实战
  • 文件传送协议:FTP 的工作原理与应用
  • 设计资讯 | 微型无线双麦克风:时间胶囊风格、功能强大
  • spring定时器@Scheduled异步调用
  • 望繁信科技入选2024年第3批上海市高新技术成果转化项目名单
  • AMD E1-1200可以用作nas服务器吗
  • 在Ubuntu16.04里安装ROS Kinetic
  • `HTTP/2` 的服务器推送功能和 `Socket.IO` 对比
  • ## 已解决:`java.sql.SQLSyntaxErrorException: SQL语法错误` 异常的正确解决方法,亲测有效!!! ###
  • DRF——请求的封装与版本管理
  • WPS宏实现一个表格拆分成多个表格的功能
  • 阿里云短信验证码的开通条件、流程
  • chainlit的基本概念聊天对话中的元素
  • golang嵌入图标
  • VIT论文阅读: A Image is Worth 16x16 Words
  • 不同路径
  • 06、stm32 引脚输入
  • 游戏开发设计模式概况
  • 如何在不破产的情况下训练AI模型
  • 开发 LLM 支持的应用程序:Azure 上的 Llama 2(5/n)