Qt 网络开发-程序员宅基地

技术标签: udp  qt  QT编程  tcp/ip  

1、socket通信

        Qt中也提供TCP/UDP的套接字通信,使用时需要包含网络模块和对应的头文件

1、在项目文件中添加

        QT += network

2、在代码中添加

        #include <QtNetwork>

2、套接字分类

1、TCP流式套接字--------------QTcpSocket

2、UDP数据包套接字--------------QUdpSocket

应用层网络的相关类

QNetworkRequest    QNetworkReplay   QNetworkAccessManager

3、TCP网络通信的实现

(1)服务器

1、创建一个TCP服务对象

        mServer = new QTcpServer;

2、调用QTcpServer对象的接口进行监听

        mServer->listen(QHostAddress::Any(IP地址),端口号);

        //当客户端链接上来时,会触发信号(newConnection),连接到信号和槽

3、在槽函数中获取和客户端通信的套接字

        mSocket = nServer->nextPandingConnection();

4、和客户端通信

发送:

        通过QTcpSocket对象的write成员函数发送数据

接收:

        收到数据会触发信号(readyRead),在连接的槽函数中调用QTcpSocket对象的read/readAll接收

(2)客户端

1、创建一个QTcpSocket对象

        mSocket= new QTcpServer;

2、通过QTcpSocket对象成员函数connectToHost连接服务器

        mSocket->connectToHost(ip,端口号);

        //连接成功后成功触发connected信号

3、和服务器通信

发送:

        通过QTcpSocket对象的write成员函数发送数据

接收:

        收到数据会触发信号(readyRead),在连接的槽函数中调用QTcpSocket对象的read/readAll接收

udp:

(1)服务器(recv)

1、创建QUdpSocket对象

        mSocket = new QUdpSocket;

2、绑定通信地址

        mSocket->bind(ip , 端口号);

3、通信(先接收)

        收到数据会触发信号(readyRead),通过QUdpSocket对象的readDatagram函数来接收

        //readDatagram(首地址(),长度,发送方ip,发送方端口号);

(2)客户端(send)

1、创建QUdpSocket对象

        mSocket = new QUdpSocket;

2、通信(先发送)

        writeDatagram(数据,接收方ip,接收方端口号);

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QUdpSocket>
#include <QTcpSocket>
#include <QTcpServer>
#include <QDebug>


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    sock = new QUdpSocket;
    conect(sock,&QUdpSocket::readyRead,this,&MainWindow::readRead);
    sock->bind(QHostAddress("127.0.0.1"),9988);//sock绑定了一个地址和一个端口
    sock->writeDatagram("hello",5,QHostAddress("127.0.0.1"),9999); //发送hello给地址和9999端口
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::readRead()
{
    char buf[100] = {0};
    sock->readDatagram(buf,100,NULL,NULL);// buf接受数据
    qDebug() << "read::" << buf ;
}

Tcp:

客户端:

MainWindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    sock = new QTcpSocket;
    connect(sock,&QTcpSocket::readyRead,this,&MainWindow::onRead); //有人发信息给sock就转
                                                                   //到槽函数onRead
    sock->bind(QHostAddress("127.0.0.1") , 9988);//sock绑定ip和端口
    sock->connectToHost(QHostAddress("127.0.0.1") , 9999); //sock去连接上ip为127.0.0.1和                 
                                                           //端口为9999的服务器
    sock->write("hello tcp",9);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::onRead()
{
    char buf[100] = {0};
    sock->read(buf,100);
    qDebug() <<"read:: " <<buf;
}



服务器:

MainWindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ser = new QTcpServer;
    connect( ser , &QTcpServer::newConnection,this,&MainWindow::onConnection);
    ser->listen(QHostAddress("192.168.21.21"),8899);


}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::onReady()
{
    char buf[100] = {0};
    sock->read(buf,100);
    qDebug() << buf;
}

void MainWindow::onConnection()
{
    sock = ser->nextPendingConnection();
    connect(sock , &QTcpSocket::readyRead,this,&MainWindow::onReady);
    sock->write("hello client",12);
}





版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_56506496/article/details/130067336

智能推荐

编辑环境变量的path内容不展开问题_系统变量path点击编辑不展开怎么办-程序员宅基地

文章浏览阅读5.8k次,点赞28次,收藏37次。编辑环境变量的path内容不展开问题自己在修改环境变量时将%…开头的变量上移到了顶部,而系统默认的则是以C:\...开头的环境变量。如下所示:将红色框内的环境变量后移置C:\...之后,点击确定后再打开path内容就可以展开了。开头的环境变量向后移,以。_系统变量path点击编辑不展开怎么办

Python爬取B站TES VS FNC 八强赛弹幕,全网最具深度的三次握手、四次挥手讲解-程序员宅基地

文章浏览阅读451次,点赞23次,收藏17次。获得返回数据,可以利用正则匹配弹幕信息获取了弹幕信息保存到本地即可爬虫完整代码import rewith open(‘八强赛弹幕.txt’, mode=‘a’, encoding=‘utf-8’) as f:f.write(i)发现一共才 14行代码就搞定了~这只是爬取10月17日当天的弹幕数据,根据日期的变化可以改变日期参数,就可以达到爬取多页的数据了既然爬取了弹幕,就这样,还是有没有什么感觉,咱们可以对弹幕进行词云分析~词云图。

377-logger日志系统设计与实现_logger如何设计-程序员宅基地

文章浏览阅读652次,点赞2次,收藏2次。logger日志系统的设计图中画圆圈的是我们实现的mprpc框架,这个框架是给别人使用的,把本地的服务发布成远程的RPC服务,框架里最重要的两个成员就是RpcProvider和RpcChannel,他们在运行的过程中会有很多正常的输出信息和错误的信息,我们不可能都cout它们到屏幕上,因为运行时间长了,屏幕上输出的信息特别多,如果万一有什么问题,我们也不好定位,真正用起来的话不方便。所以,一般出问题,我们最直接的方式就是看日志!!!日志可以记录正常软件运行过程中出现的信息和错误的信息,当我们定位问题,_logger如何设计

MongoDB详解(有这一篇就够了)-程序员宅基地

文章浏览阅读4.1k次,点赞6次,收藏23次。MongoDB 是由C++语言编写的,基于分布式文件存储的数据库,是一个介于关系数据库和非关系数据库之间的产品,是最接近于关系型数据库的NoSQL数据库。MongoDB 旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于JSON对象。字段值可以包含其他文档,数组及文档数组类似于MongoDB优点:数据处理能力强,内存级数据库,查询速度快,扩展性强,只是不支持事务。_mongodb

两种内存池管理方法对比_非固定大小的内存池-程序员宅基地

文章浏览阅读1.9k次,点赞4次,收藏11次。目录一、问题背景二、两种内存池管理2.1 固定大小内存块分配(参考正点原子STM32F4 malloc.c)2.1.1 初始化2.1.3释放原理2.2 可变大小内存块分配(参考WSF BLE协议栈buffer management)2.2.1 初始化2.2.2 分配原理2.2.3 释放原理三、总结和对比一、问题背景最近在调试ambiq apollo..._非固定大小的内存池

MPEG TS流简介-程序员宅基地

文章浏览阅读3.1k次。TS简介MPEG-TS(Transport stream)即Mpeg传输流定义于ITU-T Rec. H.222.0和ISO 13818-1标准中,属于MPEG2的系统层。MPEG2-TS面向的传输介质是网络和卫星等可靠性较低的传输介质,这一点与面向较可靠介质如DVD等的MPEG PS不同。1. TS数据包TS流由TS数据包即Transport stream packet组成。TS p...

随便推点

Zookeeper设置访问权限-程序员宅基地

文章浏览阅读1.2w次。[b][size=medium]zookeeper的身份认证有4种方式[/size][/b](1)world: 它下面只有一个id, 叫anyone, world:anyone代表任何人,zookeeper中对所有人有权限的结点就是属于world:anyone的 (2)auth: 它不需要id, 只要是通过authentication的user都有权限(zookeeper支持通过ker..._zookeeper 权限信息放哪里

SpringMVC——核心技术:异常处理(@ExceptionHandler、@ControllerAdvice)_spring @exceptionhandler message-程序员宅基地

文章浏览阅读8.7k次,点赞2次,收藏8次。SpringMVC——核心技术:异常处理(@ExceptionHandler、@ControllerAdvice)_spring @exceptionhandler message

操作系统文件系统实验报告16281027_i/o磁盘实验报告-程序员宅基地

文章浏览阅读3.6k次。实验五 文件系统1 实验简介本实验要求在模拟的I/O系统之上开发一个简单的文件系统。用户通过create, open, read等命令与文件系统交互。文件系统把磁盘视为顺序编号的逻辑块序列,逻辑块的编号为0至L − 1。2 I/O系统实际物理磁盘的结构是多维的:有柱面、磁头、扇区等概念。I/O系统的任务是隐藏磁盘的结构细节,把磁盘以逻辑块的面目呈现给文件系统。逻辑块顺序编号,编号取值范围为..._i/o磁盘实验报告

dwd明细粒度事实层设计_dwd层如何设计-程序员宅基地

文章浏览阅读1.8k次。目录1-数仓dwd事实层介绍2-数仓dwd层事实表设计原则3-数仓dwd层事实表设计规范4-建表示例1-数仓dwd事实层介绍明细粒度事实层以业务过程驱动建模,基于每个具体的业务过程特点,构建最细粒度的明细层事实表。您可以结合企业的数据使用特点,将明细事实表的某些重要维度属性字段做适当冗余,即宽表化处理。公共汇总粒度事实层(DWS)和明细粒度事实层(DWD)的事实表作为数据仓库维度建模的核心,需紧绕业务过程来设计。通过获取描述业务过程的度量来描述业务过程,包括引用的维度和与业务过程有关的度量。度量通常为_dwd层如何设计

Ambari 2.7.3.0 安装部署 hadoop 3.1.0.0 集群视频完整版_ambari2.7.3 hadoop 部署-程序员宅基地

文章浏览阅读1.5k次。一、前言很多小伙伴也都知道,最近一直在做 Ambari 集成自定义服务的教学笔记和视频。之前在准备 Ambari 环境的时候,考虑到有朋友会在 Ambari 安装部署时遇到问题,所以贴心的我呢,就在搭建 Ambari 环境的时候,把这个视频录制好了,总共时长共 87 分钟,将近1个半小时,附带移除 SmartSense 服务及 FAQ 。也提前介绍一下搭建好的 Ambari 相关版本信息:..._ambari2.7.3 hadoop 部署

使用R语言保存CSV文件_r软件保存为csv文件-程序员宅基地

文章浏览阅读881次。本文介绍了如何使用R语言保存CSV文件。我们使用write.csv函数将数据框保存为CSV格式。您只需提供要保存的数据对象和文件路径,即可轻松创建CSV文件。CSV文件是一种通用的数据交换格式,在数据分析和数据处理中广泛使用。希望本文对您有所帮助,祝您在R语言中保存CSV文件时顺利进行数据处理和分析!_r软件保存为csv文件

推荐文章

热门文章

相关标签