首先要在工程文件.por中添加network
添加新文件
在头文件中导入qtcpsocket
之后定义成员函数用于发送和接收数据
Qt封装的socket使用的是信号槽监听接收到的数据
所以需要添加监听
使用的传输格式
报文长度8字节字符串 + base64转码的json报文
头文件
#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