QT网络编程-TCP客户端编程

1. 相关类继承关系

QAbstractSocket
QIODevice
QTcpSocket
QTcpServer
  • 文件操作类都继承自QAbstractSocket,我们主要用QTcpServer 和QTcpSocket 进行编程。 类比文件操作,打开,读,写,关闭。
  • Qt提供了QTcpSocket类(封装了TCP协议细节)
  • 直接将QTcpSocket的对象当做黑盒使用,进行数据 传输
  • QTcpSocket的使用方式:
  1. 链接服务端主机 connetToHost()
  2. 发送数据 /接收数据 write() /read()
  3. 关闭连接 close()

2. 同步编程

QtTcpSocket默认是使用异步编程,但是Qt也提供了辅助函数也可以完成同步编程。

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

void SyncClientDemo()
{
    QTcpSocket client;
    char buf[256]={0};
    client.connectToHost("127.0.0.1",8000);  //指定要连接的远程主机的地址,这个IP表示本机
    qDebug()<<"Conneted:"<<client.waitForConnected();

    //QThread::sleep(5);
    qDebug()<<"Send Bytes:"<<client.write("hello world!");
    qDebug()<<"Send Status:"<<client.waitForBytesWritten();
    qDebug()<<"Data Available:"<<client.waitForReadyRead();
    qDebug()<<"Received Bytes:"<<client.read(buf,sizeof(buf)-1);
    qDebug()<<"Received Data"<<buf;

    client.close();
    client.waitForDisconnected();

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

    SyncClientDemo();
    return a.exec();
}

在这里插入图片描述

3.异步编程

  • QTcpSocket对象通过发送信号的方式返回操作结果
  • 可以再程序中将对应信号连接到槽函数,获取结果
  • Qt默认使用的是异步编程,应用程序中通常使用QTcpSocket的异步方式
  • QTCPSocket中的关键信号
    connected():成功连接到远端主机
    disconnected():远端主机断开连接
    readyRead():远端数据到达本机
    bytesWritten(qint64):数据成功发送到系统

clientdemo.c

#include "clientdemo.h"
#include <QHostAddress>
#include <QDebug>
ClientDemo::ClientDemo(QObject *parent) : QObject(parent)
{
    connect(&m_client,SIGNAL(connected()),this,SLOT(onConneted()));
    connect(&m_client,SIGNAL(disconnected()),this,SLOT(onDisConneted()));
    connect(&m_client,SIGNAL(readyRead()),this,SLOT(onDataRady()));
    connect(&m_client,SIGNAL(bytesWritten(qint64)),this,SLOT(onBytesWritten(qint64)));

}
void ClientDemo::onConneted()
{ 
    qDebug()<<"onConneted()";
    qDebug()<<"Local Address"<<m_client.localAddress();
    qDebug()<<"Local Port"<<m_client.localPort();
}
void ClientDemo::onDisConneted()
{
    qDebug()<<"onDisconneted()";

}
void ClientDemo::onDataRady()
{
    char buf[256]={0};
    qDebug()<<"onDataRady()"<<m_client.read(buf,sizeof(buf)-1);
    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();

}

clientdemo.h

 #ifndef CLIENTDEMO_H
#define CLIENTDEMO_H

#include <QObject>
#include <QTcpSocket>
class ClientDemo : public QObject  //因为用到信号与槽继承这个类
{
    Q_OBJECT
    QTcpSocket m_client;
public:
    explicit ClientDemo(QObject *parent = nullptr);

protected slots:
    void onConneted();
    void onDisConneted();
    void onDataRady();
    void onBytesWritten(qint64 bytes);
public:
    void connectTo(QString ip,int port);
    qint64 send(const char* data,int len);
    qint64 available();
    void close();
};

#endif // CLIENTDEMO_H

int main(int argc, char *argv[])
{
    char data[]="hello world!!!";
    QCoreApplication a(argc, argv);

    ClientDemo client;
    client.connectTo("127.0.0.1",8000);
    client.send(data,sizeof(data)-1);
    return a.exec();
}

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AIOT技术栈

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值