Qt 通信协议 ---tcp网络编程实现

qt tcp服务器端

// tcp.h
#include <QTcpServer>
#include <QTcpSocket>
#include <QObject>

class Tcp :public QThread
{
    Q_OBJECT
public:
    explicit Tcp( QObject *parent = 0);
    ~Tcp();
public slots:
    void ReadData();
    void callback();
    void unconnect(QAbstractSocket::SocketError);

protected:
    void run();

signals:

private:
    QTcpServer* s_server;
    QTcpSocket* s_socket;
}

监听连接客户端,接收客户端发送的数据信息,处理,返回

//tcp.cpp
#include <tcp.h>
#include <QByteArray>
#include <Qdebug> 

Tcp::Tcp(QObject *parent):QThread(parent)
{
    s_server = new QTcpServer();
    s_server->listen(QHostAddress::Any, 3000);
    connect(s_server,SIGNAL(newConnection()), this, SLOT(callback()));
}
Tcp::~Tcp()
{
   
}

void Tcp::callback()
{
    LOG_INFO("new tcp connection ! \n");  
    s_socket = s_server->nextPendingConnection();
    connect(s_socket,SIGNAL(readyRead()),this, SLOT(ReadData()));  //连接信号槽
    connect(s_socket, SIGNAL(error(QAbstractSocket::SocketError)),this,                 
    SLOT(unconnect(QAbstractSocket::SocketError))); //断开连接信号槽
}

void Tcp::ReadData()   //读取缓冲区数据
{
    LOG_INFO("Deal Tcp Data.......");
    QByteArray receive_buf = s_socket->readAll();
   
    take_deal->deal_data(receive_buf);  //接受的数据处理函数
}

void Tcp::unconnect(QAbstractSocket::SocketError)
{
    int error = s_socket->error();
    switch(error)
    {
    case QAbstractSocket::RemoteHostClosedError://客户端断开
    {
        QString hostAddress=s_socket->QAbstractSocket::peerAddress().toString();
        qDebug() << "unconnerct : "<<hostAddress;
        break;
    }
    default:
    {
        error = -1;
        qDebug() << "unconnerct :xxxx "<<endl;
        break;
    }
    }
}

void Tcp::send_data(QByteArray trans_data)
{
    const char raw_head[] = {
        0xff, 0xff, 0x00, 0x00
    };
    QByteArray data_head = QByteArray::fromRawData(raw_head, sizeof(raw_head));
    trans_data.insert(0,data_head);
    qint32 send_num = s_socket->write(trans_data.data(),trans_data.size());
    qDebug() << "send_num =  "<<send_num<<endl;
}

   qt tcp客户端实现:

//tcp_client.h
#include <QMainWindow>
#include <QTcpSocket>
#include <QHostAddress>

class TcpClient : public QMainWindow
{
    Q_OBJECT
 
public:
    explicit TcpClient(QWidget *parent = 0);
    ~MyTcpClient();
 
private:

    QTcpSocket *tcpClient;
    void connectToHost(QString str);
    void write_data(QString data);
 
private slots:
    //客户端槽函数
    void ReadData();
    void ReadError(QAbstractSocket::SocketError);
};

连接服务器端,向服务器端发送数据信息,接收服务器返回数据处理,

#include <tcpClinet.h>
#include <QMessageBox>
#include <QByteArray>

TcpClient::TcpClient(QWidget *parent) : public(parent)
{
    connectToHost("127.0.0.1");
    connect(tcpClient, SIGNAL(readyRead()), this, SLOT(ReadData()));
    connect(tcpClient, SIGNAL(error(QAbstractSocket::SocketError)), \
            this, SLOT(ReadError(QAbstractSocket::SocketError)));
}

void TcpClient::connectToHost(QString str)  //str :ip
{
    //connect
    if(tcpClient != 0)
    {
        tcpClient->disconnectFromHost();
        tcpClient->waitForDisconnected();
        tcpClient->close();
        tcpClient = 0;
    }
    tcpClient = new QTcpSocket(this);
    tcpClient->connectToHost(str, port);
    if(!tcpClient ->waitForConnected(500000)) //500s,未连接到server,停止
    {
        return;
    }
}

void TcpClient::ReadData()
{
    const char raw_head[4] = {(char)0x55,(char)0xaa,(char)0x00,(char)0x00};
    QByteArray data_head = QByteArray::fromRawData(raw_head, sizeof(raw_head));
    QByteArray buffer = tcpClient->readAll();
    if(!buffer.isEmpty())
    {
         //data deal
    }
}

void TcpClient::ReadError(QAbstractSocket::SocketError)
{
    tcpClient->disconnectFromHost();
    ui->btnConnect->setText(tr("连接"));
    QMessageBox msgBox;
    msgBox.setText(tr("failed connect server %1").arg(tcpClient->errorString()));
}

void TcpClient::write_data(QString data)  //send to server
{
    if(data != "")
    {
        tcpClient->write(data.toLatin1()); //
    }
}
    

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值