QT的TcpServer

Server服务器端

QT版本5.6.1

  1. 界面设计
    alt text
  2. 工程文件:

添加 network 模块

alt text

  1. 头文件引入TcpServer类和TcpSocketQTcpServer和QTcpSocket
#include <QTcpServer>
#include <QTcpSocket>

alt text

  1. 创建server对象并实例化:
   /*h文件中*/QTcpServer *tcpServer;/*cpp文件中*/tcpServer = new QTcpServer(this);

使用This作为父对象,方便结束进程生命周期时,释放内存空间

  1. 构建槽函数:
    alt text
private slots:void newConnection_Slot();void readyRead_Slot();void stateChanged_Slot(QAbstractSocket::SocketState);

: 在C++的类中声明函数时可以不写参数名只写参数类型,但是,在实现时必须写出参数名。例如 : void stateChanged_Slot(QAbstractSocket::SocketState);形参是枚举类型,但是没有具体的形参名

newConnection_Slot: 当有客户端的socket建立连接时,tcpserver会发送newConnection()信号,触发连接槽函数,用于创建一个新的socket与客户端对接
connect(tcpServer,SIGNAL(newConnection()),this,SLOT(newConnection_Slot()));

void Widget::newConnection_Slot()
{ui->recvEdit->append("Have a clinet connection");QTcpSocket *temptcpSocket = tcpServer->nextPendingConnection();connect(temptcpSocket,SIGNAL(readyRead()),this,SLOT(readyRead_Slot()));connect(temptcpSocket,SIGNAL(stateChanged(QAbstractSocket::SocketState)),this,SLOT(stateChanged_Slot(QAbstractSocket::SocketState)));// 客户端的ip地址QString ipaddr = temptcpSocket->peerAddress().toString();quint16 port = temptcpSocket->peerPort();// 打印客户端连接的端口信息ui->recvEdit->append("服务端:客户端的ip地址:" + ipaddr);ui->recvEdit->append("服务端:客户端的端口:" + QString::number(port));}

readyRead_Slot : 当有客户端的socket发送数据过来,服务端用来与客户端对接的socket发送数据可读信号readyRead(),触发槽函数,读数据
connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(readyRead_Slot()));

void Widget::readyRead_Slot()
{//sender()返回触发该函数的信号所属者的指针QTcpSocket *tcpSocket = (QTcpSocket *)sender();QString buf;buf = tcpSocket->readAll();ui->recvEdit->append(buf);}

stateChanged_Slot(QAbstractSocket::SocketState) : 当服务端的socket与客户端断开连接时,会发送连接状态改变信号,触发槽函数

void Widget::stateChanged_Slot(QAbstractSocket::SocketState socketState)
{QTcpSocket *tcpSocket = (QTcpSocket *)sender();switch(socketState){case QAbstractSocket::UnconnectedState:ui->recvEdit->append("connection end");tcpSocket->deleteLater();break;default:break;}}
  1. ui按键槽函数:
    void on_openBt_clicked();void on_colseBt_clicked();void on_sendBt_clicked();

void on_openBt_clicked() : 打开服务端

void Widget::on_openBt_clicked()
{//判断输入的端口号是否为空,为空则直接返回if(ui->portEdit->text().isEmpty()){ui->recvEdit->append("port is empty!!");return;}//启动监听,QHostAddress::Any表示所有IP地址tcpServer->listen(QHostAddress::Any, ui->portEdit->text().toUInt());ui->recvEdit->append("open successful");ui->openBt->setEnabled(false);ui->colseBt->setEnabled(true);
}

on_colseBt_clicked : 关闭客户端

void Widget::on_colseBt_clicked()
{//关闭tcpserver知识关闭的监听功能,不会有新的客户端建立连接,但是已经建立连接的socket仍然可以通信tcpServer->close();ui->recvEdit->append("close successful");ui->openBt->setEnabled(true);ui->colseBt->setEnabled(false);
}

on_sendBt_clicked : 发送数据

void Widget::on_sendBt_clicked()
{//返回server端与客户端建立连接的所有socketQList <QTcpSocket *> socketList = tcpServer->findChildren<QTcpSocket *>();qDebug() << "tcpSocket 数量:" << socketList.count() << endl;if (socketList.count() == 0) {ui->recvEdit->append("当前没有客户端连接,请先与客户端连接!");return;}foreach (QTcpSocket *tmpTcpSocket, socketList) {// 服务端向每个客户端发送消息tmpTcpSocket->write(ui->sendEdit->text().toUtf8());}ui->recvEdit->append("服务端:" + ui->sendEdit->text());
}

工程源码:

widget.h:

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QTcpServer>
#include <QTcpSocket>namespace Ui {
class Widget;
}class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();void state_Slot(QAbstractSocket::SocketState);private:Ui::Widget *ui;QTcpServer *tcpServer;private slots:void newConnection_Slot();void readyRead_Slot();void stateChanged_Slot(QAbstractSocket::SocketState);void on_openBt_clicked();void on_colseBt_clicked();void on_sendBt_clicked();
};#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);tcpServer = new QTcpServer(this);connect(tcpServer,SIGNAL(newConnection()),this,SLOT(newConnection_Slot()));
}Widget::~Widget()
{delete ui;
}void Widget::newConnection_Slot()
{ui->recvEdit->append("Have a clinet connection");QTcpSocket *temptcpSocket = tcpServer->nextPendingConnection();connect(temptcpSocket,SIGNAL(readyRead()),this,SLOT(readyRead_Slot()));connect(temptcpSocket,SIGNAL(stateChanged(QAbstractSocket::SocketState)),this,SLOT(stateChanged_Slot(QAbstractSocket::SocketState)));// 客户端的ip地址QString ipaddr = temptcpSocket->peerAddress().toString();quint16 port = temptcpSocket->peerPort();// 打印客户端连接的端口信息ui->recvEdit->append("服务端:客户端的ip地址:" + ipaddr);ui->recvEdit->append("服务端:客户端的端口:" + QString::number(port));}void Widget::readyRead_Slot()
{//sender()返回触发该函数的信号所属者的指针QTcpSocket *tcpSocket = (QTcpSocket *)sender();QString buf;buf = tcpSocket->readAll();ui->recvEdit->append(buf);}void Widget::stateChanged_Slot(QAbstractSocket::SocketState socketState)
{QTcpSocket *tcpSocket = (QTcpSocket *)sender();switch(socketState){case QAbstractSocket::UnconnectedState:ui->recvEdit->append("connection end");tcpSocket->deleteLater();break;default:break;}}void Widget::on_openBt_clicked()
{if(ui->portEdit->text().isEmpty()){ui->recvEdit->append("port is empty!!");return;}tcpServer->listen(QHostAddress::Any, ui->portEdit->text().toUInt());ui->recvEdit->append("open successful");ui->openBt->setEnabled(false);ui->colseBt->setEnabled(true);
}void Widget::on_colseBt_clicked()
{tcpServer->close();ui->recvEdit->append("close successful");ui->openBt->setEnabled(true);ui->colseBt->setEnabled(false);
}void Widget::on_sendBt_clicked()
{//返回server端与客户端建立连接的所有socketQList <QTcpSocket *> socketList = tcpServer->findChildren<QTcpSocket *>();qDebug() << "tcpSocket 数量:" << socketList.count() << endl;if (socketList.count() == 0) {ui->recvEdit->append("当前没有客户端连接,请先与客户端连接!");return;}foreach (QTcpSocket *tmpTcpSocket, socketList) {// 服务端向每个客户端发送消息tmpTcpSocket->write(ui->sendEdit->text().toUtf8());}ui->recvEdit->append("服务端:" + ui->sendEdit->text());
}

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

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

相关文章

NAND Flash 与 NOR Flash间的区别

非易失性存储器是一种即使未通电也能保持其内容的存储器。非易失性存储器可以有不同的形式: ROM – 只读存储器&#xff0c;数据写入一次&#xff0c;允许多次读取访问。 PROM – 可编程只读存储器&#xff0c;数据写入一次&#xff08;不是在制造过程中&#xff0c;而是以后的…

【论文速读】| LLM4FUZZ:利用大语言模型指导智能合约的模糊测试

本次分享论文&#xff1a;LLM4FUZZ: Guided Fuzzing of Smart Contracts with Large Language Models 基本信息 原文作者&#xff1a;Chaofan Shou, Jing Liu, Doudou Lu, Koushik Sen 作者单位&#xff1a;加州大学伯克利分校&#xff0c;加州大学欧文分校&#xff0c;Fuzz…

15 华三华为链路聚合综述

1 链路聚合简介 以太网链路聚合通过将多条以太网物理链路捆绑在一起形成一条以太网逻辑链路&#xff0c;实现增加链路带宽的目的&#xff0c;同时这些捆绑在一起的链路通过相互动态备份&#xff0c;可以有效地提高链路的可靠性。 2 成员端口的状态 聚合组内的成员端口具有以下…

2024年,Web开发新趋势!

随着我们迈入新的一年&#xff0c;现在正是审视2024年网页开发领域开始流行哪些趋势的绝佳时机。回顾2023年的一系列更新&#xff0c;以下是来年一些热门话题的概览。 自主托管有回归的趋势 近些年&#xff0c;自主托管一直是网页开发者和公司托管其应用程序的默认方式。开发…

蓝桥杯13届JAVA A组 国赛

​​​​​​​ package 蓝桥杯国赛; // 贪心选个数最少的进行摆 // 2:1 ,3:1, 4:1,5 : 3,6:3,7:1 // 选 1&#xff0c;7&#xff0c;4&#xff0c;2&#xff0c;3&#xff0c;5&#xff0c;9 // 然后都选满10个 public class 火彩棒数字 {public static void main(String[] a…

游戏行业被攻击的原因、攻击种类及合适的服务器

很多游戏刚上线没多久就频繁遭到同行恶意攻击。在相关数据报告中&#xff0c;2023年上半年遭受DDoS攻击的行业中&#xff0c;游戏行业占到40%&#xff0c;而且攻击方式、攻击频率、攻击峰值呈明显上升趋势。很多充满创意的游戏开发公司刚才开发上线一个很有特色的产品&#xff…

安卓实现视频录制与显示和翻转摄像头

权限&#xff1a; <!-- 相机权限 --> <uses-featureandroid:name"android.hardware.camera"android:required"false" /> <uses-permission android:name"android.permission.CAMERA" /><!-- 录音权限&#xff08;包括麦克…

Centos 7.9 配置VNCServer实现远程vnc连接

文章目录 1、Centos安装图形界面1.1、安装X Windows System图形界面1.2、安装GNOME图形界面 2、VNC SERVER配置2.1、VNC SERVER安装2.2、VNC SERVER配置1&#xff09;创建vnc配置文件2&#xff09;修改配置文件内容3&#xff09;完整配置文件参考 2.3、设置vnc密码2.4、配置防火…

网络编程套接字和传输层tcp,udp协议

认识端口号 我们知道在网络数据传输的时候&#xff0c;在IP数据包头部有两个IP地址&#xff0c;分别叫做源IP地址和目的IP地址。IP地址是帮助我们在网络中确定最终发送的主机&#xff0c;但是实际上数据应该发送到主机上指定的进程上的&#xff0c;所以我们不仅要确定主机&…

虚拟化技术 分离虚拟机数据流量与ESXi的流量管理

一、实验内容 为ESXi主机添加网卡通过vClient查看已添加的网卡信息为ESXi添加网络&#xff0c;创建标准交换机修改网络配置&#xff0c;实现虚拟机数据流量与ESXi的管理流量分离 二、实验主要仪器设备及材料 安装有64位Windows操作系统的台式电脑或笔记本电脑&#xff0c;建…

泰达克仿钻点水晶饰品包装印刷防滑UV胶特性及应用场景

仿钻点UV滴胶是一种特殊的胶水 常用于模拟钻石的效果 它是一种透明的胶水 具有高光泽度和折射率 可以在物体表面形成类似钻石的亮闪效果 仿钻点UV滴胶通常由紫外线固化胶组成 需要通过紫外线照射来固化和硬化 它具有以下特点&#xff1a; 1. 透明度&#xff1a;仿钻点UV滴胶具有…

使用 OpenCV 创建视频(74)

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇:OpenCV 库来捕获和处理视频输入和相似度测量(73) 下一篇&#xff1a;OpenCV使用 Kinect 和其他兼容 OpenNI 的深度传感器(75) 目标 每当您使用视频源时&#xff0c;您最终可能希望将图像处理结果保…

Zabbix6.0容器化部署(Docker-Composed)

Zabbix 为每个 Zabbix 组件提供 Docker image 作为可移植和自给自足的容器&#xff0c;以加快部署和更新过程。 Zabbix 组件在 Ubuntu、Alpine Linux 和 CentOS 基础 image 上提供:Zabbix 组件支持 MySQL 和 PostgreSQL 数据库、Apache2 和 Nginx Web 服务器。 1. Zabbix 组件…

ASP.NET网上车辆档案管理系统

摘 要 本文采用基于Web的Asp.net技术&#xff0c;并与sql server 2000数据库相结合&#xff0c;研发了一套车辆档案管理系统。该系统扩展性好&#xff0c;易于维护。简化了车辆档案设计流程&#xff0c;去除了冗余信息。汽车销售企业可以通过本系统完成整个销售及售后所有档案…

C语言指针的初级练习

前言 从0开始记录我的学习历程&#xff0c;我会尽我所能&#xff0c;写出最最大白话的文章&#xff0c;希望能够帮到你&#xff0c;谢谢。 提示&#xff1a;文章作者为初学者&#xff0c;有问题请评论指正&#xff0c;感谢。 哥们嗷 不知道你和我是否一样在学习C语言指针的时…

【ZZULI数据结构实验】压缩与解码的钥匙:赫夫曼编码应用

&#x1f4c3;博客主页&#xff1a; 小镇敲码人 &#x1f49a;代码仓库&#xff0c;欢迎访问 &#x1f680; 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&#x1f3fd;留言 &#x1f60d;收藏 &#x1f30f; 任尔江湖满血骨&#xff0c;我自踏雪寻梅香。 万千浮云遮碧…

使用 Docker 部署 TaleBook 私人书籍管理系统

1&#xff09;项目介绍 GitHub&#xff1a;https://github.com/talebook/talebook Talebook 是一个简洁但强大的私人书籍管理系统。它基于 Calibre 项目构建&#xff0c;具备书籍管理、在线阅读与推送、用户管理、SSO 登录、从百度/豆瓣拉取书籍信息等功能。 友情提醒&#x…

工业交换机外壳材质大比拼,看看哪种外壳适合你

在工业领域里&#xff0c;交换机就像我们的网络心脏&#xff0c;时刻跳动着确保信息畅通无阻。而它的外壳&#xff0c;就是保护这颗“心脏”的铠甲。今天&#xff0c;咱们就来聊聊这些铠甲——工业交换机外壳的材质和防护等级&#xff0c;看看它们如何守护我们的网络世界。 首…

网络编程基础回顾

计算机网络&#xff08;5&#xff09;&#xff1a;运输层 OSI 模型与 TCP/IP 协议 OSI七层协议模型 (open system interconnection) 应用层&#xff1a;为应用数据提供服务表示层&#xff1a;数据格式转化&#xff0c;数据加密会话层&#xff1a;建立、维护和管理会话传输层&…

算法设计与分析 动态规划/回溯

1.最大子段和 int a[N]; int maxn(int n) {int tempa[0];int ans0;ansmax(temp,ans);for(int i1;i<n;i){if(temp>0){tempa[i];}else tempa[i];ansmax(temp,ans);}return ans; } int main() {int n,ans0;cin>>n;for(int i0;i<n;i) cin>>a[i];ansmaxn(n);co…