QT中的服务器与客户端

一、前言

        本文主要讲讲QT中服务器与客户端的使用方法,QT已经封装好了,调用相应类直接访问即可。本文以QT中的QT中的TCP为例子,讲下使用方法以及线程中使用。

二、正文

2.1 Sever的使用方法

2.1.1 思路

QT中Sever使用的时候大致步骤为:

1、创建监听的服务器对象

2、监听到数据信号,创建QTcpSocket的套接字对象

3、检测是否可以接收数据

4、信息发送,查看数据发送是否正常

总的来说,就是先确定要监听的地址与端口,然后数据在套接字中,套接字在QT中是QTcpSocket

封装的类,直接用就行,最后通过套接字接收数据或者发送数据即可。

2.1.2 代码示例

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTcpServer>
#include <QTcpSocket>


QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private:
    Ui::Widget *ui;
    QTcpServer *m_server;
    QTcpSocket *m_tcp;
};
#endif // WIDGET_H
#include "widget.h"
#include "ui_widget.h"

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

    ui->lineEdit_port->setText("8888");

    //创建监听的服务器对象
    m_server = new QTcpServer(this);
    connect(ui->pushButton_listen, &QPushButton::clicked, this, [=](){
        m_server->listen(QHostAddress::Any, ui->lineEdit_port->text().toInt());
        ui->pushButton_listen->setDisabled(true);
    });

    //监听到数据信号,创建QTcpSocket的套接字对象
    connect(m_server, &QTcpServer::newConnection, this, [=](){
        m_tcp = m_server->nextPendingConnection();

        //检测是否可以接收数据
        connect(m_tcp, &QTcpSocket::readyRead, this, [=](){
            QByteArray data = m_tcp->readAll();
            ui->textEdit_historymsg->append("客户端说: " + data);
        });
    });

    //信息发送
    connect(ui->pushButton_send, &QPushButton::clicked, this, [=](){
        QString msg = ui->textEdit_sendmsg->toPlainText();
        m_tcp->write(msg.toUtf8());
        ui->textEdit_historymsg->append("服务器说: " + msg);
    });

}

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

2.1.3 细节讲解

创建服务器对象QTcpServer,对象有监听的方法listen。

监听的地址设置所有即可访问你电脑可以收到的所有地址,可以用win+R进入cmd查看有哪些,比如:

获取到新的连接后,将下一个挂起的连接作为已连接的QTcpSocket对象返回

准备读取信号有了后即可开始读取套接字内的数据。

2.1.4 演示

监听成功

2.2 Client的使用方法

2.2.1 思路

QT中Client使用的时候大致步骤为:

1、创建Socket对象,连接服务器

2、数据交互

3、根据需求断开连接

总体来说很简单,套接字连接好服务器的地址与端口即可,前提是服务器开启了,不然连接会失败。

2.2.2 代码示例

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTcpSocket>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private:
    Ui::Widget *ui;
    QTcpSocket *m_socket;
};
#endif // WIDGET_H
#include "widget.h"
#include "ui_widget.h"

#include <QHostAddress>

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

    ui->lineEdit_address->setText("192.168.2.24");
    ui->lineEdit_connect->setText("8888");

    //创建Socket对象,连接服务器
    m_socket = new QTcpSocket(this);
    connect(ui->pushButton_connect, &QPushButton::clicked, this, [=](){
        m_socket->connectToHost(QHostAddress(ui->lineEdit_address->text()), ui->lineEdit_connect->text().toInt());
        ui->pushButton_connect->setDisabled(true);
        ui->pushButton_close->setEnabled(true);
    });

    //断开连接
    connect(ui->pushButton_close, &QPushButton::clicked, this, [=](){
        m_socket->close();
        ui->pushButton_connect->setEnabled(true);
        ui->pushButton_close->setDisabled(true);
    });

    //数据交互
    connect(m_socket, &QTcpSocket::connected, this, [=](){
        ui->textEdit_history->append("服务器连接成功!!!!");
    });
    connect(m_socket, &QTcpSocket::readyRead, this, [=](){
        ui->textEdit_history->append("服务器说: " + m_socket->readAll());
    });
    connect(m_socket, &QTcpSocket::disconnected, this, [=](){
        ui->textEdit_history->append("服务器断开连接!!!!");
    });
    connect(ui->pushButton_send, &QPushButton::clicked, this, [=](){
        m_socket->write(ui->textEdit_send->toPlainText().toUtf8());
        ui->textEdit_history->append("客户端说: " + ui->textEdit_send->toPlainText().toUtf8());
    });
}

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

2.2.3 细节讲解

没啥可讲的,QT都封装好了,连接好就能直接用,比串口的请求响应简单方便多了。

2.2.4 演示

注意,先开启服务器,然后才能使用,局域网可以内部使用,外部使用需要申请IP。

2.3 线程中的使用

在实际项目中,数据的部分大多是写进线程的,关于线程的了解在前文中有讲述,需要的朋友可以自行查阅。

下面以文件从客户端传到服务器为例:

2.3.1 代码示例

2.3.1.1 Sever
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTcpServer>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_pushButton_listen_clicked();

private:
    Ui::MainWindow *ui;
    QTcpServer* m_server;

};
#endif // MAINWINDOW_H
#ifndef ACCEPTFILE_H
#define ACCEPTFILE_H

#include <QObject>
#include <QThread>
#include <QTcpSocket>

class acceptfile : public QThread
{
    Q_OBJECT
public:
    explicit acceptfile(QTcpSocket* tcp, QThread *parent = nullptr);

signals:
    void over();

protected:
    void run() override;

private:
    QTcpSocket* m_tcp;

};

#endif // ACCEPTFILE_H
#include "mainwindow.h"
#include "ui_mainwindow.h"

#include "acceptfile.h"

#include <QMessageBox>

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

    //创建服务器对象
    m_server = new QTcpServer(this);
    //创建套接字
    connect(m_server, &QTcpServer::newConnection, this, [=](){
        QTcpSocket* tcp = m_server->nextPendingConnection();
        //创建子线程
        acceptfile* subthread = new acceptfile(tcp);
        subthread->start();

        //释放资源
        connect(subthread, &acceptfile::over, this, [=](){
            subthread->quit();
            subthread->wait();
            subthread->deleteLater();
            QMessageBox::information(this, "文件接收", "文件接收完毕!!!!!!!");
        });
    });

}

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


void MainWindow::on_pushButton_listen_clicked()
{
    m_server->listen(QHostAddress::Any, ui->lineEdit_port->text().toUShort());
}
#include "acceptfile.h"

#include <QFile>


acceptfile::acceptfile(QTcpSocket* tcp, QThread *parent) : QThread(parent)
{
    m_tcp = tcp;
}

void acceptfile::run()
{
    //创建文件对象,保存客户端发送过来的文件内容
    QFile* file = new QFile("C:/Users/EDY/Desktop/QTtest/recv.txt");
    file->open(QFile::WriteOnly);
    //读取套接字socket的内容
    connect(m_tcp, &QTcpSocket::readyRead, this, [=](){
        static int total = 0;
        static int count = 0;
        if(count == 0)
        {
            m_tcp->read((char*)&total, 4);
        }
        //读出剩余数据
        QByteArray all = m_tcp->readAll();
        count += all.size();
        file->write(all);

        //判断是否接收完毕
        if(total == count)
        {
            m_tcp->close();
            m_tcp->deleteLater();
            file->close();
            file->deleteLater();
            emit over();
        }
    });
    //进入事件循环
    exec();
}
2.3.1.2 Client
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

#include <QThread>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

signals:
    void startconnect(unsigned short, QString);
    void sendFile(QString path);

private slots:
    void on_connectserver_btn_clicked();

    void on_file_btn_clicked();

    void on_send_btn_clicked();

private:
    Ui::MainWindow *ui;

};
#endif // MAINWINDOW_H
#ifndef SENDFILE_H
#define SENDFILE_H

#include <QObject>
#include <QTcpSocket>

class sendfile : public QObject
{
    Q_OBJECT
public:
    explicit sendfile(QObject *parent = nullptr);

    //连接服务器
    void connectServer(unsigned short address, QString ip);

    //发送文件
    void sendFile(QString path);

signals:
    void connectOK();
    void gameover();
    void curpercent(int);

private:
    QTcpSocket* m_tcp;

};

#endif // SENDFILE_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "sendfile.h"

#include <QFileDialog>
#include <QMessageBox>

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

    ui->port->setText("8888");
    ui->IP->setText("192.168.2.24");
    ui->progressBar->setRange(0, 100);
    ui->progressBar->setValue(0);

    //创建线程对象
    QThread* thrd = new QThread;
    //创建任务
    sendfile* worker = new sendfile;
    //将work放入子线程
    worker->moveToThread(thrd);
    //连接服务器
    connect(this, &MainWindow::startconnect, worker, &sendfile::connectServer);
    //连接文件发送
    connect(this, &MainWindow::sendFile, worker, &sendfile::sendFile);
    //处理连接服务器的子线程数据
    connect(worker, &sendfile::connectOK, this, [=](){
        QMessageBox::information(this, "连接服务器",  "连接成功!!!!");
    });
    connect(worker, &sendfile::gameover, this, [=](){
        //资源释放
        thrd->quit();
        thrd->wait();
        worker->deleteLater();
        thrd->deleteLater();
    });
    //处理选择文件发送子线程数据
    connect(worker, &sendfile::curpercent, ui->progressBar, &QProgressBar::setValue);

    //线程开始
    thrd->start();
}

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


void MainWindow::on_connectserver_btn_clicked()
{
    QString ip = ui->IP->text();
    unsigned short port = ui->port->text().toUShort();
    emit startconnect(port, ip);
}

void MainWindow::on_file_btn_clicked()
{
    QString path = QFileDialog::getOpenFileName();
    if(path.isEmpty())
    {
        QMessageBox::warning(this, "打开文件", "选择的文件路径不能为空!!");
        return;
    }
    ui->file->setText(path);
}

void MainWindow::on_send_btn_clicked()
{
    emit sendFile(ui->file->text());
}
#include "sendfile.h"

#include <QFile>
#include <QFileInfo>

sendfile::sendfile(QObject *parent) : QObject(parent)
{

}

void sendfile::connectServer(unsigned short address, QString ip)
{
    m_tcp = new QTcpSocket;
    m_tcp->connectToHost(ip, address);
    connect(m_tcp, &QTcpSocket::connected, this, &sendfile::connectOK);
    connect(m_tcp, &QTcpSocket::disconnected, this, [=](){
        m_tcp->close();
        m_tcp->deleteLater();
        emit gameover();
    });
}

void sendfile::sendFile(QString path)
{
    QFile file(path);
    QFileInfo info(path);

    int filesize = info.size();

    file.open(QFile::ReadOnly);

    while (!file.atEnd())
    {
        static int num = 0;
        if(num == 0)
        {
            m_tcp->write((char*)&filesize, 4);
        }
        QByteArray line = file.readLine();
        num += line.size();
        int percent = (num * 100 / filesize);
        emit curpercent(percent);

        m_tcp->write(line);
    }
}

2.3.2 代码讲解

没啥好讲的,可以看看代码,写得很详细,文件传输部分跟普通数据也是一样的,区别就是需要用到文件的类QFile和QFileInfo,一个是文件对象,一个是文件信息对象。简单来说指文件是QFile,指文件的具体数据是QFileInfo。源码已上传

2.3.3 演示

QTcp服务器与客户端

5、QT的使用——TCP客户端和服务器 TCP客户端和服务器 阅读详情

相关推荐

Qt框架下服务器的实现

Qt框架提供了QTcpServe和QTcpSocket两种类实现TCP协议的相关连接,TCP协议不再过多赘述,以下主要讲述自机服务器和自机客户端的连接实现TCP协议通信的具体方式。使用Qt网络模块之前需要在.pro文件种加入network。

sumfortp的博客 1513

qt5.0中服务器和客户端的连接

qt5.0中服务器和客户端的连接及通信

m0_57665952的博客 2171

QT中的tcp一个服务器处理多个客户端

客户端: 我们先在头文件中 在头文件中添加#include <QTcpSocket> 声明一个空的QTcpSocket *tcpsocket=nullptr; 我们在.cpp文件的初始化位置new 一个QTcpSocket()对象; tcpsocket = new QTcpSocket(); 通过以下代码指定需要连接的服务器的IP和端口 tcpsocket->conne...

豫 1万+

QT网络通信-服务器(一)

网络有TCP和UDP。本文主要通过QT完成TCP网络设计,通过ESP8266与单片机进行通讯。

weixin_44597885的博客 2395

QT基础篇(10)QT5网络与通信

QT5网络与通信是指在QT5开发环境中使用网络进行数据传输和通信的相关功能和技术。QT5提供了一套完善的网络模块,包括了TCP、UDP、HTTP等协议的支持,可以方便地在QT应用程序中进行网络通信。通过QT5的网络模块,开发者可以实现客户端和服务器之间的数据传输、消息推送、远程控制等功能。在QT5中,可以使用QTcpSocket类和QUdpSocket类来实现TCP和UDP协议的数据传输。QTcpSocket类提供了基于TCP协议的套接字接口,可以实现可靠的数据传输和连接管理;

m0_57260797的博客 4276

QT服务器与客户端源代码深入剖析

Qt是一个跨平台的应用程序和用户界面框架,由挪威的Trolltech公司开发。自1991年诞生以来,QT框架经过数次重大更新,成为了众多开发者的首选工具之一。它以C++为基础,提供了丰富的工具集和库,能够帮助开发者快速构建稳定且美观的桌面、嵌入式和移动应用。在QT中,网络开发主要依赖于QT网络模块(QtNetwork)。

weixin_29215509的博客 950

qhttp:Qt5和C++14中的轻量级异步HTTP库(服务器和客户端)

qhttp:Qt5和C++14中的轻量级异步HTTP库(服务器和客户端) 【下载地址】qhttpQt5和C14中的轻量级异步HTTP库服务器和客户端 `qhttp` 是一个基于 Qt5 和 C++14 的轻量级异步 HTTP 库,支持 HTTP 服务器和客户端的实现。该库旨在提供一个简单、高效且易于使用的接口,帮助开发者...

gitblog_09706的博客 1094

QT实现TCP服务器与客户端通信案例代码

Qt是一个跨平台的C++应用程序框架,被广泛应用于开发GUI应用程序。其提供的网络模块能够使开发者在Qt框架内高效地进行网络编程,满足客户端和服务器端的通信需求。Qt的网络类库非常丰富,支持TCP、UDP等多种网络协议,为网络应用开发提供了强大的支持。QTcpServer类是基于TCP协议的网络编程中,服务器端的核心类。它负责监听指定端口的网络请求,接受新的客户端连接,并将接入的连接抽象为QTcpSocket对象供后续操作使用。特点主要体现在以下几个方面:异步操作。

weixin_42502040的博客 424

用QT实现客户端与服务器端通信

使用QT实现客户端与服务器端通信。

喜喜安的博客 2618

QTcpServer服务详解:Qt Creator实现与应用

在网络编程的世界中,QTcpServer扮演着至关重要的角色。它是Qt框架中的一个类,用于在TCP/IP协议基础上建立一个服务器端的网络服务。QTcpServer能够监听网络端口,接受客户端的连接请求,并管理这些连接,使得数据能够在客户端和服务器之间双向传输。QTcpServer的基本功能可以概括为以下几个方面:监听指定的TCP端口,等待客户端的连接请求。接受新的连接请求,并为每一个连接创建一个新的QTcpSocket对象。发送和接收数据,管理与客户端之间的数据交换。

weixin_32099703的博客 1111

在STM32上运行小波变换及神经网络算法——(一)单片机中小波算法编写

在单片机上实现离散小波变换的C代码,通过确定信号长度、小波分解层数、小波基名称后进行编写,并改写成了方便调用的结构体格式。

weixin_45400202的博客 986

Qt之UDP通信

UDP(User Datagram Protocol 即用户数据报协议)是一个轻量级的,不可靠的,面向数据报的无连接协议。由于 UDP 的特性:它不属于连接型协议,因而具有资源消耗小,处理速度快的优点,所以通常音频、视频和普通数据在传送时使用 UDP 较多,因为它们即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。UDP 通信示意图如下:UDP 消息传送有三种模式,分别是单播、广播和组播三种模式。①单播(unicast)

风间琉璃的博客 3万+

告别编译报错!手把手教你用VS2022命令行编译curl静态库(附完整测试代码)

本文详细介绍了如何在VS2022环境下通过命令行编译curl静态库,从环境准备、编译实战到项目集成,提供了完整的避坑指南和测试代码。特别针对常见的编译报错如LNK2019等给出了具体解决方案,帮助开发者高效完成网络库的静态编译与集成。

weixin_42557803的博客 447

【QT】Qt 网络

如果顺序反过来, 可能会出现端⼝绑定好了之后, 请求就过来了. 此时还没来得及连接信号槽. 那么这个请求就有可能错过了.添加之后要手动编译⼀下项目,使。4、修改 widget.cpp 中的 Widget 构造函数, 通过信号槽, 处理收到的服务器的响应.3、修改 widget.cpp, 给按钮增加点击的 slot 函数, 实现发送请求给服务器.2、在 widget.cpp 中, 先创建两个全局常量, 表⽰服务器的 IP 和 端⼝。5、再次修改 Widget 的构造函数, 通过信号槽, 来处理服务器的响应.

YoungMLet的博客 4282

PX4二次开发实战:从零构建自定义飞控模块

本文详细介绍了PX4二次开发的实战指南,从环境搭建到自定义飞控模块的创建,涵盖了uORB消息定义、外部传感器驱动集成、控制算法实现等关键步骤。通过具体代码示例和调试技巧,帮助开发者快速入门PX4二次开发,构建高效稳定的无人机飞控系统。

weixin_29175469的博客 339

基于WEKWS模型的语音唤醒关键词识别

本文所使用的模型网络结构继承自论文《Compact Feedforward Sequential Memory Networks for Small-footprint Keyword Spotting》,文中研究了将低秩矩阵分解与传统FSMN相结合的紧凑型前馈顺序记忆网络(cFSMN)用于远场关键字检测任务。

YuZhou的博客 6596

QT中的TCP通信

Qt中TCP通信的方式,客户端和服务器

lao_loog的博客 670

[机器学习-回归实例] 李宏毅机器学习作业一:PM2.5 预测实例

[机器学习-回归实例] 李宏毅机器学习作业一:PM2.5 预测实例 简介   这是一个回归预测的实例,数据集来自李宏毅的《机器学习》课程的第一次作业,可以用来训练一个线性回归模型或者其他的回归模型,动手实践学习到的理论知识,在实践中去发现问题。这篇文章主要包括数据集的解释、数据的预处理过程及线性回归模型的代码实现这三个部分。由于这个数据集并不能直接使用,还需进行一些重构,为了对初学者更友好一些,我会提供重构完的可以读取后就直接使用的数据集,我也会提供 Matlab\rm MatlabMatlab 可直接使用

qq_27309515的博客 3574

Qt中利用TCP实现客户端与服务器端的数据传输

Qt中利用TCP实现客户端与服务器端的数据传输 标签: QTtcp服务器 2016-07-11 21:40 3182人阅读 评论(0) 收藏 举报 本文章已收录于: 版权声明:本文为博主原创文章,未经博主允许不得转载。 最近想用Qt做一个简单的聊天室,用到了TCP传输,在此整理一下有关TCP传输的东西。(只是简单的实现数据传送,对于

ASKLW的博客 2942

10、高阶ΣΔ调制器设计与优化

本文深入探讨了高阶ΣΔ调制器的设计与优化技术,重点介绍了NTF零点优化方法,通过分散单位圆上的零点分布提升信噪失真比(SQNR)。文章分析了量化噪声耦合技术如何有效提高噪声整形阶数,并对比了CIFB、CIFF、CRFB和CRFF等不同架构的性能特点。同时,详细阐述了基于稳定性与性能权衡的设计流程,结合Schreier的Delta-Sigma Toolbox实现NTF综合与仿真验证。内容涵盖从理论推导到实际设计步骤,为高阶ΣΔ调制器的稳定性提升与性能优化提供了系统性指导。

tgb345678的博客 134

MATLAB之把多个小cell拼成一个数组

问题描述 现有一个cell向量 L (90000,1),每个元素都是由一个(100X9)的double数组组成的.如图. 其中, 每个cell元素都是一个单独的数据, 我们要把它转换成(90000, 19, 100)的三维数组. cell2mat, 但是所有的数据会堆叠起来 L2=cell2mat(L); % (90000, 19) reshape, 变成三维数组 reshape的原理是从上到下, 从左往右拆开重组. 目前只有19这一维数据与要求一致, 那就以这个为突破口. L2=L2'; %

落日之城 9250

【QT】QT中的网络编程(TCP 和 UDP通信)

服务器: socket --》bind --》listen --》accept --》read/write --》close。客户端: socket --》bind --》connect --》read/write --》close。QT中: QHostAddress::Any --》获取本地主机上的任意一个ip。linux中: INADDR_ANY --》获取本地主机上的任意一个ip。QTcpServer --》表示服务器。QTcpSocket --》表示套接字。现象同1.2.1.2。

qq_62917398的博客 1803

手机开发实战58——小区广播介绍2

业务 针对小区广播短消息的特点,可以提供一些基于目前短消息不能或不适合提供的服务: 1. 显示网络服务基站名称:用户可以随时了解手机登记在哪个基站下,特别是在边界交叉覆盖区域,用户可以清楚的知道通话建立在哪个基站下,在用户投诉和故障描述中也会有所帮助; 2. 提供用户问候信息:可以在覆盖机场、车站等地区的基站广播一些用户问候语或一些企业形象广告语; 3. 充分利用小区广播地

xjbclz的专栏 772

QT:QT与操作系统

QT与操作系统

海绵宝宝de派小星的博客 6630

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

QT之TCP通信

QT中可以通过TCP协议让服务器和客户端之间行通信。所以下面我就围绕服务器和客户端来写。 这是我们写服务器和客户端的具体流程: A、服务器: 1.创建QTcpServer对象 2.启动服务器(监听)调用成员方法listen(QHostAddress::Any,端口号) 3.当有客户端链接时候会发送newConnection信号...

u011555996的博客 6856

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

C++学习之游戏服务器开发十五QT登录器实现

C++学习之游戏服务器开发十五QT登录器实现

qq_27302885的博客 1670

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

上一篇: QT中通过网站访问天气数据
下一篇: FFmpeg初步了解
PJ...
博客等级 码龄5年 412粉丝 38原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值