Qt TCP相关的一些整理:客户端常见操作 socket 通信 network

本文介绍了使用Qt进行TCP通信,包括在工程中添加相关库,创建客户端和服务端类,展示了如何连接服务器、发送和接收数据,以及使用信号槽处理异步收包的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1、相关的库和类

2、一些常用的API

3、帖子用到的完整核心代码:


1、相关的库和类

        Qt下使用tcp协议,需要在工程的pro文件中添加:

         QT    += network

        需要添加network网络库之后,才可以使用对应的类

客户端的类头文件:

#include <QTcpSocket>

服务端的类头文件:

#include <QTcpServer>

2、一些常用的API

客户端相关:

连接服务器:connectToHost

    virtual void connectToHost(const QString &hostName, quint16 port, OpenMode mode = ReadWrite, NetworkLayerProtocol protocol = AnyIPProtocol);
    virtual void connectToHost(const QHostAddress &address, quint16 port, OpenMode mode = ReadWrite);

有两种写法,但是前2个参数都是目标计算机的IP、Port,其他值可以不屑,都是有缺省值的

如: 

  在头文件中添加 指针成员:

QTcpSocket *m_client;

在构造函数中就可以直接初始化,然后调用connectToHost来连接服务器:

m_client = new QTcpSocket(this); 
m_client->connectToHost("127.0.0.1",8898);

判断有没有连接上,可以使用  waitForConnected,默认等待30秒

if(m_client->waitForConnected()){     
        qDebug()<<"conn ok";    
}else{        
        qDebug()<<"conn fail"<<m_client->errorString();   
}

连接之后,就需要收包,发包的处理:

发包函数:write,有3种写法,第三种其实相当于第一种,不过使用了内联来处理,使得调用的时候,更加方便

qint64 write(const char *data, qint64 len);    
qint64 write(const char *data);    
inline qint64 write(const QByteArray &data)    
{ return write(data.constData(), data.size()); }

使用的时候,可以在按钮槽里面直接发送内容:

void TcpMainWindow::on_pushButton_clicked()
{    
        char buffer[] = "码蚁软件欢迎您";    
        qDebug()<<m_client->write(buffer,sizeof(buffer));
}

收包函数: read、readAll

qint64 read(char *data, qint64 maxlen);    
QByteArray read(qint64 maxlen);
QByteArray readAll();

一般在读取数据之前,都会简单判断一下是否有数据可读,用到函数  

bytesAvailable,返回长度大于0,表示有数据可读
virtual qint64 bytesAvailable() const;

由于Qt中的收包是异步非阻塞的,还得需要配合收包信号来处理一下才可以,需要自定义槽来配合信号处理收包

收包信号:

void readyRead();

自定义一个槽函数来处理:

如:

void myRead(); // 收包槽

就可以在构造函数里面,连接上服务端之后,关联收包信号和自定义收包槽:

connect(m_client,SIGNAL(readyRead()),this,SLOT(myRead()));

最后,就可以在任何想要发包的地方,使用对象来调用write函数发包即可;

下一篇再把服务端部分也给简单整理一下。

3、帖子用到的完整核心代码:

完整代码下载地址:

点我下载

 

头文件:

#ifndef TCPMAINWINDOW_H
#define TCPMAINWINDOW_H

#include <QMainWindow>
#include <QTcpSocket>

namespace Ui {
class TcpMainWindow;
}

class TcpMainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit TcpMainWindow(QWidget *parent = 0);
    ~TcpMainWindow();

private slots:
    void myRead();  // 收包槽函数

    void on_pushButton_clicked();

private:
    Ui::TcpMainWindow *ui;
    QTcpSocket *m_client;

};

#endif // TCPMAINWINDOW_H

源文件:

#include "tcpmainwindow.h"
#include "ui_tcpmainwindow.h"
#include <QDebug>

TcpMainWindow::TcpMainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::TcpMainWindow)
{
    ui->setupUi(this);
    m_client = new QTcpSocket(this);
    m_client->connectToHost("127.0.0.1",8898);
    if(m_client->waitForConnected()){
        qDebug()<<"conn ok";
        connect(m_client,SIGNAL(readyRead()),this,SLOT(myRead()));
    }else{
        qDebug()<<"conn fail"<<m_client->errorString();
    }
}

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

void TcpMainWindow::myRead()
{
    QByteArray buffer = m_client->readAll();
    qDebug()<<buffer;
    // 只是简单的打印输出,还没有做解包处理
}

void TcpMainWindow::on_pushButton_clicked()
{
    char buffer[] = "码蚁软件欢迎您";
    qDebug()<<m_client->write(buffer,sizeof(buffer));
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

五木大大

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

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

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

打赏作者

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

抵扣说明:

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

余额充值