Qt 网络开发

本文详细介绍了在Qt框架下如何进行TCP和UDP的网络通信。通过QTcpServer和QTcpSocket实现TCP流式套接字的服务器和客户端通信,以及QUdpSocket进行UDP数据包套接字的发送与接收。同时提到了QNetworkAccessManager等相关类在应用层网络通信中的作用。
摘要由CSDN通过智能技术生成

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);
}





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值