首页 > 编程语言 >QT-网络编程

QT-网络编程

时间:2023-08-25 20:12:36浏览次数:42  
标签:QTcpServer QT 编程 qint64 网络 QHostAddress QTcpSocket include 连接

说明

当涉及 Qt 网络编程时,通常会使用 Qt 提供的网络模块,其中最常用的是 QTcpSocket 和 QTcpServer 类

QTcpSocket

QTcpSocket 是 Qt 网络模块中的一个类,用于实现 TCP 客户端的网络通信。它提供了一个接口,允许你连接到远程主机并在网络上发送和接收数据

1.构造函数

QTcpSocket(QObject *parent = nullptr);

你可以通过这个构造函数创建一个 QTcpSocket 实例。可以通过 parent 参数设置父对象,用于管理对象的内存释放。

2.连接

void connectToHost(const QString &hostName, quint16 port, OpenMode openMode = ReadWrite);
void connectToHost(const QHostAddress &address, quint16 port, OpenMode openMode = ReadWrite);

3. 信号和槽:

QTcpSocket 提供了多个信号和槽,用于处理连接状态、数据接收等。常用的信号包括 connected()(连接成功时触发)、disconnected()(断开连接时触发)、readyRead()(有数据可读时触发)等。

4.数据传输

qint64 write(const char *data, qint64 maxSize);
qint64 write(const QByteArray &byteArray);
qint64 read(char *data, qint64 maxSize);
QByteArray read(qint64 maxSize);

通过这些函数,你可以向套接字写入数据或从套接字读取数据。write() 将数据发送到连接的远程主机,read() 从连接中读取数据。

5. 关闭连接:

void close();
void disconnectFromHost();

close() 函数用于关闭套接字。disconnectFromHost() 函数用于断开与远程主机的连接。

6. 异常处理:

QTcpSocket 可以通过检查状态和错误代码来处理连接和数据传输中的异常情况。例如,可以使用 state() 函数检查连接状态,使用 error() 函数获取最后一次出现的错误。

QTcpServer

QTcpServer 是 Qt 网络模块中的一个类,用于创建 TCP 服务器以侦听连接请求,并为每个连接创建相应的 QTcpSocket 实例,以便进行数据交换。

1.构造函数

QTcpServer(QObject *parent = nullptr);

通过这个构造函数可以创建一个 QTcpServer 实例。parent 参数用于设置父对象,以便在内存管理方面进行管理。

2.开始监听

bool listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0);

调用这个函数会使服务器开始监听来自特定 IP 地址和端口的连接请求。你可以通过 address 参数设置要监听的 IP 地址,使用 QHostAddress::Any 表示监听所有可用的网络接口。port 参数指定监听的端口号,使用 0 表示自动选择一个空闲端口。

3.信号和槽

QTcpServer 提供了多个信号和槽,用于处理新连接的到来、连接状态等。常用的信号包括 newConnection()(当有新的连接请求时触发)和 acceptError(QAbstractSocket::SocketError socketError)(当出现错误时触发)

4.处理连接:

QTcpSocket *nextPendingConnection();

在 newConnection() 信号触发后,你可以调用这个函数来获取一个待处理的连接。它会返回一个指向 QTcpSocket 实例的指针,你可以通过这个实例与客户端进行数据交换。

5. 关闭服务器:

void close();

6.异常处理

QTcpServer 可以通过检查状态和错误代码来处理服务器运行中可能出现的异常情况。例如,可以使用 isListening() 函数检查服务器是否在监听状态,使用 serverError() 函数获取最后一次出现的错误

7.多线程

在一些情况下,需要为每个连接创建一个新的线程,以避免主线程被阻塞。可以将 QTcpServer 与多线程结合使用,以提高服务器的并发性能。

8.SSL 加密:

QTcpServer 可以与 Qt 的 SSL 模块结合使用,从而创建安全的加密连接。这在保护敏感数据的通信中很有用。

这个函数用于关闭服务器,停止监听连接请求。

客户端

#include <QtNetwork>
#include <QTcpSocket>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    
    QTcpSocket socket;
    socket.connectToHost("127.0.0.1", 12345);
    if (!socket.waitForConnected()) {
        qDebug() << "Connection failed!";
        return 1;
    }
    
    qDebug() << "Connected to server.";
    socket.write("Hello from client!");
    socket.flush();
    
    if (socket.waitForReadyRead()) {
        QByteArray response = socket.readAll();
        qDebug() << "Response from server: " << response;
    }
    
    socket.disconnectFromHost();
    
    return a.exec();
}

服务端

#include <QtNetwork>
#include <QTcpServer>
#include <QTcpSocket>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    
    QTcpServer server;
    if (!server.listen(QHostAddress::Any, 12345)) {
        qDebug() << "Server could not start!";
        return 1;
    }
    qDebug() << "Server started. Listening on port 12345...";
    
    QObject::connect(&server, &QTcpServer::newConnection, [&](){
        QTcpSocket *socket = server.nextPendingConnection();
        QObject::connect(socket, &QTcpSocket::readyRead, [&](){
            QByteArray data = socket->readAll();
            qDebug() << "Received: " << data;
            socket->write("Server received: " + data);
            socket->flush();
        });
    });
    
    return a.exec();
}
#include <QtNetwork>
#include <QTcpServer>
#include <QTcpSocket>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    
    QTcpServer server;
    if (!server.listen(QHostAddress::Any, 12345)) {
        qDebug() << "Server could not start!";
        return 1;
    }
    qDebug() << "Server started. Listening on port 12345...";
    
    QObject::connect(&server, &QTcpServer::newConnection, [&](){
        QTcpSocket *socket = server.nextPendingConnection();
        QObject::connect(socket, &QTcpSocket::readyRead, [&](){
            QByteArray data = socket->readAll();
            qDebug() << "Received: " << data;
            socket->write("Server received: " + data);
            socket->flush();
        });
    });
    
    return a.exec();
}

标签:QTcpServer,QT,编程,qint64,网络,QHostAddress,QTcpSocket,include,连接
From: https://www.cnblogs.com/doubleconquer/p/17657822.html

相关文章

  • Calico 网络基础配置
    Calico网络配置概述通常,我们建议在没有网络覆盖/封装的情况下运行Calico。这为您提供了最高性能和最简单的网络;离开工作负载的数据包就是传输到网络上的数据包。然而,当在无法轻松了解工作负载IP的底层网络上运行时,选择性地使用覆盖/封装可能会很有用。一个常见的例子是,如果您......
  • c# .NET 高级编程 高并发必备技巧 - 锁
    锁最为常见的应用就是高并发的情况下,库存的控制。本次只做简单的单机锁介绍。直接看代码:每请求一次库存-1.假如库存1000,在1000个人请求之后,库存将变为0。publicintReduce0(){intr=0;stringkey="stock";stringstoc......
  • 网络请求-Android篇(Okhttp和Retrofit)
    一.OkHttp的介绍和基本用法OkHttp是一个流行的开源Java和Android应用程序的HTTP客户端。它由SquareInc.开发,提供了一种简单高效的方式来进行应用程序中的HTTP请求。要在Java或Android项目中使用OkHttp,您需要将OkHttp依赖项添加到您的build.gradle文件中。然后,您可以创建一个......
  • 资深网络工程师的网络排障全过程,太强了!【附工具下载】
    下午好,我的网工朋友我们知道,交换机是局域网中一种很重要的网络设备,它的工作状态与客户端系统的上网状态息息相关。可是,在实际工作过程中,交换机的状态很容易受到外界的干扰,那样一来局域网中就会出现各种各样的网络故障。为了保证网络运行稳定,我们必须在平时对交换机进行妥善管理、维......
  • 网络规划设计师真题解析--IP地址类(一)
    将地址块192.168.0.0/24按照可变长子网掩码的思想进行子网划分,若各部门可用主机地址需求如下表所示,则共有(27)种划分方案,部门3的掩码长度为(28)。(2018年)(27)A.4B.8C.16D.32(28)A.25B.26C.27D.28部门所需地址总数部门1100部门250部门316部门410部门58答案:(27)C(28)C解析:(27)部门所......
  • 海康大华宇视等网络摄像机RTSP流采用websecket和H5进行RTSP网页无插件直播点播
    一.背景分析随着移动互联网时代的到来,安防监控领域为了适应互联网的发展要求,首先由国内安防监控龙头企业(海康、大华、宇视)带头先后开发了萤石云、乐橙云等互联网视频云服务,为广大个人或者企业监控用户提供的优质的视频互联网监控服务;而事实上,不管是海康大华等老牌监控厂商、还是新......
  • Qt编写网易云界面 (6) -----排行榜实现
    今天实现一下排行榜模块,效果如图:UI设计:主要qss代码:/*排行榜内容*/QLabel#labRankl{font-family:"微软雅黑"; color:rgb(55,55,55); font-size:20px; font-weight:bold;}/*查看全部*/QLabel#labmore1,#labmore2{font-family:"微软雅黑";font-size:......
  • 石油石化行业网络监控运维方案,全局态势感知,实时预警
        石油石化行业是一个高科技密集型行业,投资巨大、人员众多,各产业价值链的关联度较高,大型石油石化企业实现了上中下游产业的一体化协同发展。随着工业4.0时代的来临,信息化和工业化融合,物联网、云计算等新技术的普及推广,在驶入智能化赛道后,石油石化行业也在经济高速发展的......
  • 解锁未来网络新奇体验:探索算力网络的边缘创新
    在当今数字时代,我们正处于网络变革的前沿,而算力网络正是这场变革的引领者之一。随着5G时代的到来,算力网络以其创新性和前瞻性,正在重新定义我们对网络构架的认知。让我们一起深入探索,了解算力网络如何为未来网络构建带来新奇体验,重点聚焦于其在边缘计算领域的突破创新。**迎接边缘计......
  • Android并发编程高级面试题汇总(含详细解析 九)
    Android并发编程高级面试题汇总最全最细面试题讲解持续更新中......