人员管理客户端练习(五)Qt使用QSocket做tcp简单客户端

目录

(一)Qt制作简单的无边框登陆窗口
(二)Qt制作简单配置窗口
(三)Qt简单使用表格
(四)Qt文件和json
(五)Qt使用QSocket做tcp简单客户端
(六)Qt中代码添加背景图

1.首先要在工程文件.por中添加network

image

2.添加新文件

在头文件中导入qtcpsocket

image

之后定义成员函数用于发送和接收数据

Qt封装的socket使用的是信号槽监听接收到的数据

所以需要添加监听

image

使用的传输格式

报文长度8字节字符串 + base64转码的json报文

image

头文件

#ifndef TCPSOCKET_H
#define TCPSOCKET_H
#include<QTcpSocket>

class TcpSocket
{
//    Q_OBJECT
public:
    TcpSocket(QString &ip, quint16 port);
    // 原始数据做base64转码发送
    void sendData(QString data);
    // 读取数据需要做同样操作
    QByteArray readData();
    ~TcpSocket();
    QTcpSocket* m_tcp;
private:

};

#endif // TCPSOCKET_H

源文件

#include "tcpsocket.h"


TcpSocket::TcpSocket(QString &ip, quint16 port)
{
    m_tcp = new QTcpSocket();
    m_tcp->connectToHost(ip, port, QTcpSocket::ReadWrite);
}

void TcpSocket::sendData(QString data)
{
    // 数据做base64转码
    QByteArray base64 = data.toUtf8().toBase64();
    QString le;
    // 预留8字节保存长度
    le.sprintf("%08d", base64.size());
    // 拼接数据 报文长度+报文
    base64 = le.toUtf8() + base64;
    // 发送数据
    m_tcp->write(base64.data(), base64.size());

}

QByteArray TcpSocket::readData()
{
    char buf[9]={0};
    // 每次取8个字节长度
    m_tcp->read(buf, 8);
    int len = atoi(buf);
    // 保存数据缓冲区
    char data[len+1] = {0};
    // 读取指定长度
    m_tcp->read(data, len);
    // base64转码
    QByteArray row = QByteArray::fromBase64(data);
    return row;
}


TcpSocket::~TcpSocket()
{
    delete m_tcp;
}

码云代码位置
https://gitee.com/YiZhiLuGuoDeXiaoMaNong/personnel-management

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个简单Qt TCP 客户端的代码示例: ```cpp #include <QtNetwork> #include <QTcpSocket> class Client : public QObject { Q_OBJECT public: explicit Client(QObject *parent = nullptr); public slots: void connectToServer(); void sendMessage(); private slots: void readMessage(); void displayError(QAbstractSocket::SocketError socketError); private: QTcpSocket *m_socket; }; Client::Client(QObject *parent) : QObject(parent) , m_socket(new QTcpSocket(this)) { connect(m_socket, &QTcpSocket::readyRead, this, &Client::readMessage); connect(m_socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(displayError(QAbstractSocket::SocketError))); } void Client::connectToServer() { m_socket->connectToHost("127.0.0.1", 8888); } void Client::sendMessage() { QString message = "Hello, server!"; QByteArray data; QDataStream out(&data, QIODevice::WriteOnly); out << quint16(0) << message.toUtf8(); out.device()->seek(0); out << quint16(data.size() - sizeof(quint16)); m_socket->write(data); } void Client::readMessage() { QDataStream in(m_socket); if (m_socket->bytesAvailable() < sizeof(quint16)) { return; } quint16 blockSize; in >> blockSize; if (m_socket->bytesAvailable() < blockSize) { return; } QString message; in >> message; qDebug() << "Received message: " << message; } void Client::displayError(QAbstractSocket::SocketError socketError) { qDebug() << "Error: " << socketError; } int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); Client client; client.connectToServer(); client.sendMessage(); return a.exec(); } ``` 在 `Client` 类中,我们创建了一个 `QTcpSocket` 变量 `m_socket` 作为客户端的套接字。我们连接了 `readyRead` 信号,以便在收到服务器的响应时读取数据。我们在 `displayError` 槽中处理错误信号。 在 `connectToServer` 槽中,我们使用 `connectToHost` 函数连接到服务器。 在 `sendMessage` 槽中,我们创建一个数据流并将其用于打包消息。我们首先写入一个 0 的 16 位整数,以便稍后重新定位并写入消息大小。然后我们将消息写入数据流中并将其写入套接字。 在 `readMessage` 槽中,我们首先检查是否有足够的字节可供读取。然后我们读取一个 16 位整数以确定消息的大小,然后我们读取消息本身并在控制台上输出。 在 `main` 函数中,我们创建了 `Client` 类的实例,并通过调用 `connectToServer` 和 `sendMessage` 函数来连接到服务器并发送消息。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值