QT:QT实现TCP协议

1.服务器端

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QTcpServer>//服务器端类
#include <QMessageBox>//消息对话框
#include <QTcpSocket>//客户端类
#include <QList>//链表容器类
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_startBtn_clicked();public slots:void newConnection_slot();//newConnection信号对应的槽函数声明void readRead_slot();//readyRead信号对应的槽函数声明
private:Ui::Widget *ui;//实例化一个服务器指针QTcpServer *server;//定义一个存放客户端的容器QList<QTcpSocket *>socketList;
};
#endif // WIDGET_H

main.cpp

#include "widget.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}

widget.cpp

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget),server(new QTcpServer(this))//给服务器指针 实例化空间
{ui->setupUi(this);this->setWindowTitle("服务器");
}Widget::~Widget()
{delete ui;
}//启动服务器按钮对应的槽函数
void Widget::on_startBtn_clicked()
{//获取ui界面上的端口号quint16 port = ui->portEdit->text().toUInt();//将字符串转换成整形//让服务器设置监听//函数原型://bool listen(const QHostAddress &address=QHostAddress::Any,quint16 port=0)//参数1:监听的主机地址 可以任意主机//参数2:监听的端口号//返回值:bool 监听成功 true 否则falseif(server->listen(QHostAddress::Any,port)){QMessageBox::information(this,"成功对话框","启动服务器成功!");//监听成功}else{//监听失败QMessageBox::information(this,"失败对话框","启动服务器失败");return;}//程序运行至此,意味着服务器监听成功,如果有客户端发来连接请求,服务器就会自动发射一个newConnection()信号//那么我们就可以将该信号链接到自定义的槽函数中connect(server,&QTcpServer::newConnection,this,&Widget::newConnection_slot);
}//newConnection信号对应的槽函数
void Widget::newConnection_slot()
{//获取最新连接客户端的套接字//函数原型QTcpSocket *s=server->nextPendingConnection();//将套接字放入链表容器中socketList.push_back(s);//此时说明服务器与客户端成功建立了连接,如果客户端向服务器发来数据,那么客户端就会自动发射一个readyRead信号//将该信号链接到自定义的槽函数中,在槽函数中读取数据connect(s,&QTcpSocket::readyRead,this,&Widget::readRead_slot);
}//readyRead()信号对应的槽函数
void Widget::readRead_slot()
{//移出无效客户端for(int i=0;i<socketList.count();i++){//功能:判断客户端与服务器//未连接的枚举对应的值为0if(socketList.at(i)->state()==0){//删除下标socketList.removeAt(i);}}for(int i=0;i<socketList.count();i++){//bytesAvailable():返回数据的大小if(socketList.at(i)->bytesAvailable()>0){//读取数据QByteArray msg = socketList.at(i)->readAll();//将读到的数据放入到ui界面上ui->listWidget->addItem(QString::fromLocal8Bit(msg));//将数据广播给所有客户端for(int j=0;j<socketList.count();j++){socketList.at(j)->write(msg);}}}}

2.客户端

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QTcpSocket>//客户端类
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_conneBtn_clicked();void on_sendBtn_clicked();void on_disconnectBtn_clicked();public slots:void connect_slot();void readyRead_slot();void disconnected_slot();private:Ui::Widget *ui;//实例化一个客户端指针QTcpSocket *socket;//定义一个存储用户的变量QString username;
};
#endif // WIDGET_H

main.cpp

#include "widget.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}

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->msgEdit->setEnabled(false);//不可用ui->sendBtn->setEnabled(false);ui->disconnectBtn->setEnabled(false);//如果成功链接到服务器,客户端就会自动发射一个connect信号//将信号链接到自定义的槽函数,由于只需要连接一次,所以连接函数写在构造函数中connect(socket,&QTcpSocket::connected,this,&Widget::connect_slot);//如果连接到服务器向客户端发来数据,客户端就会自动发射一个readyread信号//将该信号链接到自定义的槽函数中,读取数据,由于只需要连接一次,那么连接函数写在构造函数中connect(socket,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);
}Widget::~Widget()
{delete ui;
}//连接按钮对应的槽函数处理
void Widget::on_conneBtn_clicked()
{//获取到ui界面上的ip和端口号QString ip=ui->ipEdit->text();quint16 port=ui->portEdit->text().toUInt();//将字符串转换成整形//客户端连接服务器socket->connectToHost(ip,port);}//connected对应槽函数
void Widget::connect_slot()
{//告诉服务器 我上线username=ui->usernameEdit->text();QString msg=username+"进入聊天室";//将数据发送给服务器socket->write(msg.toLocal8Bit());//至此服务器和客户端已经建立连接ui->msgEdit->setEnabled(true);//可用ui->sendBtn->setEnabled(true);ui->disconnectBtn->setEnabled(true);ui->conneBtn->setEnabled(false);ui->label_2->setEnabled(false);ui->label_3->setEnabled(false);}
//readyRead()信号对应的槽函数
void Widget::readyRead_slot(){//读数据QByteArray msg=socket->readAll();//将读取到的数据放入到ui界面上ui->listWidget->addItem(QString::fromLocal8Bit(msg));
}void Widget::disconnected_slot()
{//如果输入框内有内容则清空ui->msgEdit->clear();//按钮的重新启用与不可用ui->msgEdit->setEnabled(false);ui->sendBtn->setEnabled(false);ui->disconnectBtn->setEnabled(false);ui->conneBtn->setEnabled(true);
}
//发送按钮的槽函数
void Widget::on_sendBtn_clicked()
{//获取ui界面上的内容QString msg=ui->msgEdit->text();msg=username+":"+msg;socket->write(msg.toLocal8Bit());//将信息发送给服务器//清空输入框的内容ui->msgEdit->clear();}//断开与服务器连接所对应的自定义槽函数
void Widget::on_disconnectBtn_clicked()
{QString msg = username + "退出聊天室";socket->write(msg.toLocal8Bit());socket->disconnectFromHost();connect(socket,&QTcpSocket::disconnected,this,&Widget::disconnected_slot);}

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

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

相关文章

cat,tac,nl,more,less,head,tail,od,touch-读书笔记(五)

文件内容查阅 cat 由第一行开始显示文件内容 tac 从最后一行开始显示&#xff0c;可以看出 tac 是 cat 的倒着写&#xff01; nl 显示的时候&#xff0c;顺道输出行号&#xff01; more 一页一页的显示文件内容 less 与 more 类似&#xff0c;但是比 more 更好的是&#x…

OpenAI 推出新网络爬虫GPTBot,为GPT-5做准备

目录 一、GPTBot是什么&#xff1f;它是如何工作的&#xff1f;二、GPTBot 与 Google Bot 等搜索引擎网络爬虫有何不同&#xff1f;三、GPTBot 与 Perplexity AI 的网络爬虫有何不同&#xff1f;四、允许 GPTBot 爬取有哪些风险和好处&#xff1f;4.1 允许 GPTBot 的好处4.2 允…

笔记-Building Apps with the ABAP RESTful Application Programming Model-Week3

Week3 Unit 1: The Enhanced Business Scenario 本节介绍了将要练习的demo的业务场景,在前两周成果的基础上,也就是只读列表,也可以说是报表APP基础上启用了事务能力,也就是CURD以及自定义业务功能的能力,从创建基本的behavior definition,然后behavior definition proj…

Blob 转 Uint8Array、Uint8Array 转 Blob、String 转 Uint8Array、Uint8Array 转 String、异或

Blob 转 Uint8Array blobToArrayBuffer(blob, callback) {let reader new FileReader();reader.onload function() {return callback(this.result);}reader.readAsArrayBuffer(blob); }Uint8Array 转 Blob // 假设我们有一个Uint8Array const uint8Array new Uint8Array([…

Python(8):文件的IO读写操作(操作普通文件/csv/excel)

文章目录 一、文件的IO读写操作1.常用的文件读取标志符2.普通文件的读操作 二、csv文件的读写操作1.读取操作2.读取时候跳过某一行3.列表方式写入csv文件4.字典方式写入csv文件 三、excel的数据操作&#xff08;非pandas模块&#xff09;1.读取excel的某个sheet的某一行的某一列…

【C++】stringstream

stringstream 定义于头文件 <sstream>&#xff0c;它其实是个别名&#xff0c;具体定义如下&#xff1a; typedef basic_stringstream<char> stringstream;<sstream> 定义了三个类&#xff1a;istringstream、ostringstream 和 stringstream&#xff0c;分别…

【WPF应用41】WPF中的Expander控件详解

Windows Presentation Foundation&#xff08;WPF&#xff09;中的Expander控件是一个用于显示详细信息的交互式UI元素。它允许用户通过点击标题来展开或折叠内容区域。Expander控件通常用于在界面上组织内容&#xff0c;提供一种可见/隐藏的功能&#xff0c;以帮助用户专注于当…

java数据结构与算法刷题-----LeetCode268. 丢失的数字

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 数学位运算 数学 解题思路&#xff1a;时间复杂度O( n n n)&…

锐腾授权世强硬创代理导热硅脂等热界面材料,最大化降低界面热阻

随着热界面材料下游新兴应用领域如数据中心、新能源汽车、可穿戴设备等的高速发展&#xff0c;其散热需求也将同步上升&#xff0c;国内热界面材料行业市场规模呈现上涨态势。 在此趋势下&#xff0c;国内锐腾新材料制造&#xff08;苏州&#xff09;有限公司&#xff08;下称…

从零到部署指南:Ubuntu上安装Boost和Crow库

1.安装boost 在安装Crow之前&#xff0c;需要确保您的系统中已经安装了Boost库。以下是Boost库安装步骤&#xff1a; 首先&#xff0c;从Boost官方网站或通过特定的链接下载Boost的源码&#xff0c;boost源码具体可参看这个链接&#xff1a; https://blog.csdn.net/duan199201…

Qt项目.pro文件配置详解

# Qt项目.pro文件配置详解#QT模块引入部分: QT core gui # 这一行指定了当前项目需要用到的Qt模块&#xff0c;其中core是基础模块&#xff0c;包含了Qt的基础功能&#xff1b;gui则是图形用户界面模块&#xff0c;用于创建和管理GUI应用。#条件编译部分: greaterThan(QT_MAJO…

vue3+高德地图+turfjs实现等压线,色斑图(用于显示气象,环境等地图场景)

首先是turf.js(英文官网),也有中文网不过也就目录翻译了一下. 高德官网自行获得key 使用turf的isobands api实现. 数据: 需要准备geojson格式经纬度信息业务值(比如温度,高度,光照只要是number值什么数据都可以) 国内各地区geojson数据点这里获得 参考的是这位大佬写的内容 我…

洛谷 - P1187 3D模型

3D模型 题目描述 一座城市建立在规则的 n m n \times m nm 网格上&#xff0c;并且网格均由 1 1 1 \times 1 11 正方形构成。在每个网格上都可以有一个建筑&#xff0c;建筑由若干个 1 1 1 1 \times 1 \times 1 111 的立方体搭建而成&#xff08;也就是所有建筑的底部…

Unity MySql安装部署与Unity连接 下篇

一、前言 上篇讲到了如何安装与部署本地MySql&#xff1b;本篇主要讲Unity与MySql连接、创建表、删除表&#xff0c;然后就是对表中数据的增、删、改、查等操作。再讲这些之前会说一些安装MySql碰到的一些问题和Unity连接的问题。 当把本地MySql部署好之后&#xff0c;我们可能…

rollup 插件架构-驱动设计 PluginDriver

文章目录 GraphPluginDriver生成 PluginDriver 实例和 PluginCache 缓存创建插件上下文 pluginContext初始化 pluginContext 缓存设置、方法插件中使用缓存可替换的 replace pluginContextPluginDriver 提供 asyn、first、parallel 等类型 hookgetSortedPlugins 运行时收集并存…

uniapp 小程序获取WiFi列表

<template><view ><button click"getWifiList">获取WiFi列表</button><scroll-view:scroll-top"scrollTop"scroll-yclass"content-pop"><viewclass"itemInfo"v-for"(item, index) in wifiList&…

网络原理(应用层、传输层)

文章目录 一、应用层1.1 自定义协议1.2 通用协议XMLJSONprotobuf 二、传输层2.1 UDP协议2.2 TCP协议协议端格式及解析可靠性机制确认应答超时重传连接管理&#xff08;三次握手&#xff0c;四次挥手&#xff09;流量控制拥塞控制 效率机制滑动窗口延迟应答捎带应答 粘包问题TCP…

3月产品更新来袭,快来看有没你期待的功能

亮点更新一览 增强制作报表易用性&#xff0c;提升用户体验&#xff0c;如仪表盘图层锁定保持原有层级、即席查询支持批量选择表字段。 增强报表展示和分析能力&#xff0c;满足更多项目需求&#xff0c;如仪表盘表格支持配置是否显示分析菜单按钮、Web电子表格新增多选输入…

Unity(MVC思想)

MVC 一下演示使用MVC和不使用MVC的做法区别。 前两个没有使用MVC 主面板逻辑&#xff1a; mainPanel是该脚本名字 每个场景中不一定存在该面板&#xff0c;单纯的显隐需要去手动挂载过于麻烦。 所以自己读取创建面板出来(每个场景仅创建一次)&#xff0c;存下该面板&#xf…

车载平板丨车载数据终端是什么,如何在农机领域发挥作用

车载数据终端是指一种能够获取和处理车辆及其周边环境信息的设备&#xff0c;它集成了GPS导航、行车记录仪、车况诊断、通信等功能&#xff0c;能够实时监测车辆的位置、速度、行驶路线、油耗等数据&#xff0c;为车辆管理和运营提供数据支持。在农机领域&#xff0c;车载数据终…