Qt实现TCP网络编程

 更新时间:2022年08月19日 09:49:39   作者:一滴涌入大海的雨滴  
这篇文章主要为大家详细介绍了Qt实现TCP网络编程,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了Qt实现TCP网络编程的具体代码,供大家参考,具体内容如下

1.Qt中的TCP客户端编程

Qt中的TCP客户端编程:

对于Qt编程而言,网络只是数据传输的通道
Qt提供了QTcpSocket类(封装了TCP协议细节)
将QTcpSocket的对象当做黑盒使用,进行数据收发

QTcpSocket的使用方式:

1.连接服务端主机(connectToHost())
2.发送数据/接受数据(write()/read())
3.关闭连接(close())

QTcpSocket的注意事项:

默认情况下,QTcpSocket使用异步编程的方式:
操作完成后立即返回
通过发送信号的方式返回操作结果
QTcpSocket提供了辅助函数,可完成同步编程的方式
waitForConnected()/waitForDisconnected()
waitForBytesWritten()/waitForReadyread()

QTcpSocket的同步编程:

编程实验:同步编程

#include <QCoreApplication>
#include <QTcpSocket>
#include <QDebug>
#include <QThread>

void SyncClientDemo()
{
    QTcpSocket client;
    char buf[256] = {0};
    client.connectToHost("127.0.0.1",8080);

    qDebug() << "Connected:" << client.waitForConnected();
    qDebug() << "Send Bytes:" << client.write("CKY");
    qDebug() << "Send Status:" << client.waitForBytesWritten();
    qDebug() << "Data Avilable:" << client.waitForReadyRead();
    qDebug() << "Received Bytes:" << client.read(buf, sizeof(buf));
    qDebug() << "Received Data:" << buf;

    QThread::sleep(5000);

    client.close();

    client.waitForDisconnected();

}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    SyncClientDemo();

    return a.exec();
}

QTcpSocket的异步编程:

QTcpSocket对象通过发送信号的方式返回操作结果
可以在程序中将对应的信号连接到槽函数,获取结果
GUI应用程序中通常使用QTcpSocket的异步方式

QTcpSocket中的关键信号:

connected():成功连接远端主机
disconnected():远端主机断开连接
readyRead():远程数据到达本机
bytesWritten(qint64):数据成功发送至系统(OS)

编程实验:QTcpSocket异步编程

#include "clientdemo.h"
#include <QDebug>
#include <QHostAddress>

ClientDemo::ClientDemo(QObject* parent) : QObject(parent)
{
    connect(&m_client, SIGNAL(connected()), this, SLOT(onConnected()));
    connect(&m_client, SIGNAL(disconnected()), this, SLOT(onDisconnected()));
    connect(&m_client, SIGNAL(readyRead()), this, SLOT(onDataReady()));
    connect(&m_client, SIGNAL(bytesWritten(qint64)), this, SLOT(onBytesWritten(qint64)));
}


void ClientDemo::onConnected()
{
    qDebug() << "onConnected()";
    qDebug() << "Local Address:" << m_client.localAddress();
    qDebug() << "Loacl Port:" << m_client.localPort();
}
void ClientDemo::onDisconnected()
{
    qDebug() << "onDiecennected()";
}
void ClientDemo::onDataReady()
{
    char buf[256] = {0};

    qDebug() << "onDataReady:" << m_client.read(buf, sizeof(buf));
    qDebug() << "Data:" << buf;
}
void ClientDemo::onBytesWritten(qint64 bytes)
{
    qDebug() << "onBytesWritten" << bytes;
}
void ClientDemo::connectTo(QString ip, int port)
{
    m_client.connectToHost(ip, port);
}
qint64 ClientDemo::send(const char* data, int len)
{
    return m_client.write(data, len);
}
qint64 ClientDemo::available()
{
    return m_client.bytesAvailable();
}
void ClientDemo::close()
{
    m_client.close();
}

1.Qt中的TCP服务端编程

网络中的服务端:
服务端是为客户端服务的,服务的内容诸如向客户端提供资源,保存客户端数据,为客户端提供功能接口,等
Client/Server软件架构简介

特点;
服务端被动接受连接(服务端无法主动连接客户端)
服务端必须公开网络地址(容易受到攻击)
在职责上:
客户端倾向于处理用于交互及体验(GUI)
服务端倾向于用户数据的组织和存储(数据处理)

B/S网络结构是什么?
Browser/Server软件架构简介
B/S是一种特殊的C/S网络架构
B/S中的客户端统一使用浏览器(Browser)
B/S中的客户端GUI通常采用HTML进行开发
B/S中的客户端与服务端通常采用http协议进行通信

Qt中的TCP服务端编程:

Qt提供了QTcpServer类
将QTcpServer的对象当做黑盒使用,进行连接监听
每一个连接生成一个QTcpSocket对象进行通信

QTcpServer的使用方式:

监听本机地址的端口(listen())
通过信号通知客户端连接(newConnection())
获取QTcpSocket通信对象(nextPendingConnection())
停止监听(close())

QTcpServer的注意事项:

用于处理客户端连接,不进行具体通信
监听的端口只用于响应连接请求
监听到连接后,生成QTcpSocket对象与客户端通信

Client/Server交互流程:

编程实验:QServerSocket编程

#include "serverdemo.h"
#include "QHostAddress"
#include <QDebug>
#include <QTcpServer>
#include <QObjectList>

ServerDemo::ServerDemo(QObject* parent) : QObject(parent)
{
    connect(&m_server, SIGNAL(newConnection()), this, SLOT(onNewConnection()));
}

void ServerDemo::onNewConnection()
{
    qDebug() << "onNewConnection";
    QTcpSocket* tcp = m_server.nextPendingConnection();
    connect(tcp, SIGNAL(connected()), this, SLOT(onConnected()));
    connect(tcp, SIGNAL(disconnected()), this, SLOT(onDisconnected()));
    connect(tcp, SIGNAL(readyRead()), this, SLOT(onDataReady()));
    connect(tcp, SIGNAL(bytesWritten(qint64)), this, SLOT(onBytesWritten(qint64)));
}

bool ServerDemo::start(int port)
{
    bool ret = true;

    if(!m_server.isListening())
    {
        ret = m_server.listen(QHostAddress("127.0.0.1", port));
    }

    return ret;
}

void ServerDemo::stop()
{
    if(m_server.isListening())
    {
        m_server.close();
    }
}

void ServerDemo::onConnected()
{
    QTcpServer* tcp = dynamic_cast<QTcpServer*>(sender());

    if(tcp != NULL)
    {
        qDebug() << "onConnected()";
        qDebug() << "Local Address:" << tcp->localAddress();
        qDebug() << "Loacl Port:" << tcp->localPort();
    }

}
void ServerDemo::onDisconnected()
{
    qDebug() << "onDiecennected()";
}
void ServerDemo::onDataReady()
{
    QTcpServer* tcp = dynamic_cast<QTcpServer*>(sender());
    char buf[256] = {0};

    if(tcp != NULL)
    {
        qDebug() << "onDataReady:" << tcp->read(buf, sizeof(buf));
        qDebug() << "Data:" << buf;
    }
}
void ServerDemo::onBytesWritten(qint64 bytes)
{
    qDebug() << "onBytesWritten" << bytes;
}

ServerDemo::~ServerDemo()
{
    const QObjectList& list = m_server.children();
    for(int i = 0; i < list.length(), i++)
    {
        QTcpSocket* tcp = dynamic_cast<QTcpSocket*>(list[i]);
        if(tcp != NULL)
        {
            tcp->close();
        }
    }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Qt5.9.5 随机转盘小项目的实现示例

    Qt5.9.5 随机转盘小项目的实现示例

    本文主要介绍了Qt5.9.5随机转盘小项目的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • C++名称空间介绍

    C++名称空间介绍

    这篇文章主要介绍了C++名称空间,这是一个很重要的概念——名称空间,有些书本里翻译成了命名空间,对应的英文是namespace。下面来看文章对此的详细介绍吧,需要的小伙伴可以参考一下

    2021-12-12
  • C语言实现纸牌游戏(小猫钓鱼)

    C语言实现纸牌游戏(小猫钓鱼)

    这篇文章主要为大家详细介绍了C语言实现纸牌游戏,小猫钓鱼游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-10-10
  • C++多线程实现TCP服务器端同时和多个客户端通信

    C++多线程实现TCP服务器端同时和多个客户端通信

    通讯建立后首先由服务器端发送消息,客户端接收消息;接着客户端发送消息,服务器端接收消息,实现交互发送消息。本文主要介绍了C++多线程实现TCP服务器端同时和多个客户端通信,感兴趣的可以了解一下
    2021-05-05
  • C语言数据结构之判断循环链表空与满

    C语言数据结构之判断循环链表空与满

    这篇文章主要介绍了C语言数据结构之判断循环链表空与满的相关资料,希望通过本文能帮助到大家,让大家掌握这部分内容,需要的朋友可以参考下
    2017-10-10
  • C语言实现将字符串转换为数字的方法

    C语言实现将字符串转换为数字的方法

    这篇文章主要介绍了C语言实现将字符串转换为数字的方法,涉及系统函数atoi()函数的使用技巧,需要的朋友可以参考下
    2014-12-12
  • 重启后nvidia-smi命令不可执行出现“Make sure that the latest NVIDIA driver is installed and running.”的问题解决

    重启后nvidia-smi命令不可执行出现“Make sure that the latest NVIDIA 

    这篇文章主要介绍了重启后nvidia-smi命令不可执行,出现“Make sure that the latest NVIDIA driver is installed and running.”问题,本文给大家分享最新完美解决方法,需要的朋友可以参考下
    2022-12-12
  • 关于C/C++中typedef的定义与用法总结

    关于C/C++中typedef的定义与用法总结

    在C还是C++代码中,typedef都使用的很多,在C代码中尤其是多,typedef与#define有些相似,其实是不同的,特别是在一些复杂的用法上,需要的朋友可以参考下
    2012-12-12
  • C++ 计算时间差的五种方法小结

    C++ 计算时间差的五种方法小结

    本文主要介绍了C++ 计算时间差的五种方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • C++ 中CListCtrl的每个项都显示不同的提示信息

    C++ 中CListCtrl的每个项都显示不同的提示信息

    这篇文章主要介绍了C++ 中CListCtrl的每个项都显示不同的提示信息的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
    2017-09-09

最新评论