Qt建立服务端和客户端

embedded/2024/9/23 0:32:36/

一. C语言中

1. 服务器端流程Server

        1. 创建套接字--socket()

        2.将套接字与其ip地址,端口号进行绑定--bind()

        3. 将套接字设置成被动监听状态--listen()

        2和3是Qt中的listen(),1,2和3实质就是把自己的信息固定下来,等待别人与之通信

        4. 阻塞等待客户端的连接请求--accept()

        5. 进行通信 1)recv(),read()接收数据 send() write()发送数据

        6. 关闭套接字--close()

2. 客户端流程Client

        1. 创建套接字--socket()

        绑定ip及端口号(可选),此步可以随机让系统产生.

        2. 发送客户端的连接请求--connect()

        3, 进行通信 recv() read() 接收数据

        send() write() 发送数据

        4. 关闭套接字--close()

二. Qt中

1. 服务器端流程Server

  1. 创建套接字服务器 QTcpServer 对象

  2. 通过 QTcpServer 对象设置监听,即:QTcpServer::listen()

  3. 基于 qTcpserver::newconnection()信号检测是否有新的客户端连接

  4. 如果有新的客户端连接调用 QTcpSocket *QTcpserver::nextPendingconnection()得到通信的套接字对象

  5. 使用通信的套接字对象 QTcpSocket和客户端进行通信

    #include "widget.h"
    #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
    {ui->setupUi(this);this->setWindowTitle("服务器");server = new QTcpServer(this);connect(server,&QTcpServer::newConnection,[=](){socket = server->nextPendingConnection();ui->checkroomTex->append("与客户建立了联接...");connect(socket,&QTcpSocket::readyRead,[=](){QString recMeg = socket->readAll();ui->checkroomTex->append("客户端输出:"+recMeg);});connect(socket,&QTcpSocket::disconnected,[=](){ui->checkroomTex->append("客户端断开了连接");socket->deleteLater();});});
    }Widget::~Widget()
    {delete ui;
    }void Widget::on_startBtn_clicked()
    {int port = ui->port->text().toInt();server->listen(QHostAddress::Any,port);ui->startBtn->setEnabled(false);}void Widget::on_senderBtn_clicked()
    {QString sendMsg = ui->senderTex->toPlainText();socket->write(sendMsg.toUtf8());ui->checkroomTex->append("服务器端输出:"+sendMsg);ui->senderTex->clear();
    }
    

2. 客户端流程Client

        1)创建通信的套接字类QTcpSocket对象

        2)使用服务器端绑定的IP和端口连接服务器QAbstractSocket::connectToHost()

        3)使用QTcpSocket对象和服务器进行通信

#include "widget.h"
#include "ui_widget.h"
#include <QHostAddress>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);this->setWindowTitle("客户端");//建立套接字socket = new QTcpSocket(this);//确认是否已经连接成功connect(socket,&QTcpSocket::connected,[=](){ui->checkroomTex->append("与服务器连接成功");});connect(socket,&QTcpSocket::readyRead,[=](){QString recMsg = socket->readAll();ui->checkroomTex->append("服务器输出"+recMsg);});connect(socket,&QTcpSocket::disconnected,[=](){ui->checkroomTex->append("服务器断开了");ui->linkserverBtn->setEnabled(true);ui->disconnectBtn->setEnabled(false);});
}Widget::~Widget()
{delete ui;
}void Widget::on_linkserverBtn_clicked()
{QString ip = ui->address->text();unsigned int port = ui->port->text().toUInt();socket->connectToHost(QHostAddress(ip),port);ui->linkserverBtn->setEnabled(false);ui->disconnectBtn->setEnabled(true);}void Widget::on_senderBtn_clicked()
{QString sendMsg = ui->senderTex->toPlainText();socket->write(sendMsg.toUtf8());ui->checkroomTex->append("客户端输出"+sendMsg);ui->senderTex->clear();
}void Widget::on_disconnectBtn_clicked()
{socket->close();ui->linkserverBtn->setEnabled(true);ui->disconnectBtn->setEnabled(false);
}


http://www.ppmy.cn/embedded/34161.html

相关文章

微服务---gateway网关

目录 gateway作用 gateway使用 添加依赖 配置yml文件 自定义过滤器 nacos上的gateway的配置文件 我们现在知道了通过nacos注册服务&#xff0c;通过feign实现服务间接口的调用&#xff0c;那对于不同权限的用户访问同一个接口&#xff0c;我们怎么知道他是否具有访问的权…

【数据结构初阶】直接插入排序

最近浅学了直接插入排序&#xff0c;写个博客做笔记&#xff01;笔记功能除外若能对读者老爷有所帮助最好不过了&#xff01; 直接插入排序是插入排序的一种&#xff0c;那么介绍直接插入排序之前先介绍一下常见的排序算法&#xff01; 目录 1.常见的排序算法 2.直接插入排…

贪心算法入门

. - 力扣&#xff08;LeetCode&#xff09;. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/split-a-string-in-balanced-strings/description/ 一旦满足条件就进行…

论文阅读_使用有向无环图实现流程工程_AgentKit

英文名称: AgentKit: Flow Engineering with Graphs, not Coding 中文名称: AgentKit&#xff1a;使用图而非编码进行流程工程 链接: https://arxiv.org/pdf/2404.11483.pdf 代码: https://github.com/holmeswww/AgentKit 作者: Yue Wu, Yewen Fan, So Yeon Min, Shrimai Prabh…

基于频率比模型采用arcgis的滑坡易发性评估

目录 参考视频:频率比模型地形因子处理shp文件与缓冲区地理校准填补缺失值利用模糊隶属度进行归一化易发性结果出图处理:参考视频: 1. ArcGIS滑坡易发性评价_哔哩哔哩_bilibili 2. landslides susceptibility assessemnt using frequently ration approach /滑坡敏感性制图…

学习c#第21天 字符串常用方法(上下)

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Stringtest { internal class Program { static void Main(string[] args) { //字符串常用方法 …

HCIP-Datacom-ARST必选题库_OSPF【道题】

某工程师利用2台路由器进行IPv6测试&#xff0c;他想要通过运行OSPFv3实现IPv6网络的互联互通。关于R1需要进行的OSPPv3相关配置&#xff0c;正确的有? [R1] router id 10.1.1.1A [R1-Giqabi tEthernet0/0/1] ospfv3 1 area 0 [R1-ospfv3-11 router-id 10.1.1.1 [R1-ospfv3…

JVM之类的生命周期

类的生命周期&#xff1a;加载&#xff0c;连接&#xff08;该阶段比较复杂&#xff0c;可以被分为验证、准备、解析&#xff0c;这三个阶段&#xff09;&#xff0c;初始化&#xff08;最重要&#xff0c;因为程序员可以干涉&#xff09;&#xff0c;使用&#xff0c;卸载。 加…