QT network支持

服務器端

// 監聽網絡端口的數據
// 連接信號與槽函數
void Widget::initserver()
{
    server = new QTcpServer;
    //監聽
    server->listen(QHostAddress::AnyIPv4,10010);
    //  綁定新連接信號與槽函數
    connect(server,SIGNAL(newConnection()),this,SLOT(newConnectslot()));
}
// 連接成功分配套接字
void Widget::newConnectslot()
{
    //  分配套接字
    QTcpSocket  *socket = server->nextPendingConnection();
    //讀取網絡數據
    connect(socket,SIGNAL(readyRead()),this,SLOT(readyReadslot()));
    //  掉線信號
    connect(socket,SIGNAL(disconnected()),this,SLOT(disconnectslot()));
}
// 讀取整包網絡數據
void Widget::readyReadslot()
{
    QTcpSocket *socket = (QTcpSocket *)sender();
    //讀取所有網絡所有數據
    QByteArray data;
    if(socket->bytesAvailable())
    {
        data.append(socket->readAll()); // 獲取所有網絡數據
    }
    translate(socket,data); //處理網絡數據
}
// 網絡斷開連接,清除本地套接字,關閉連接
void Widget::disconnectslot()
{
    QTcpSocket *socket = (QTcpSocket*)sender();
    //刪除list列表
    socket->close();
    socket->deleteLater();
}

客戶端

 #include "network.h"
//獲取當前對象的指針
Network *Network::getNet()
{
  static Network net;
  return &net;
}
//  初始化網絡
void Network::initNetwork()
{
   if(socket == NULL)
   {
       socket = new QTcpSocket;
       //  172.16.22.170 
       // 設置登錄的服務器端口 與 IP地址
       socket->connectToHost("zuozl.top",20006);
       connect(socket,SIGNAL(readyRead()),this,SLOT(readyReadSlot()));
   }
}
//發送數據
bool Network::sendData(QByteArray data)
{
   if(socket !=NULL)
   {
       if(socket->write(data)>0)
       {
           return true;
       }else{
           return false;
       }
   }
   return false;
}

Network::Network(QObject *parent) : QObject(parent)
{
    socket = NULL;
}
// 讀取數據
void Network::readyReadSlot()
{
   QByteArray data;
   while(socket->bytesAvailable())
   {
       data.append(socket->readAll());
   }
   //將數據轉發給Login
   emit sendLoginData(data);  // 發送信號   一個軟件是進程   軟件中有很多線程
}
#ifndef NETWORK_H
#define NETWORK_H
/*網絡類*/
#include <QObject>
#include <QTcpSocket>

class Network : public QObject
{
    Q_OBJECT
public:
    static Network* getNet();
    void initNetwork();
    bool sendData(QByteArray data);
private:
    explicit Network(QObject *parent = nullptr);

signals:
    void sendLoginData(QByteArray data);//  信號的定義

public slots:
    void readyReadSlot();
private:
    QTcpSocket *socket;
};

#endif // NETWORK_H
// 通過網絡發送數據
   QByteArray data = Protocol::packData("register","id",id,"name",name,"passwd",passwd);
   Network::getNet()->initNetwork();
   Network::getNet()->sendData(data);
// 通過網絡接收數據
// 連接網絡連接 與 槽函數
   connect(Network::getNet(),SIGNAL(sendLoginData(QByteArray)),this,SLOT(receiveDataslot(QByteArray)));
void Login::receiveDataslot(QByteArray data)
{
    // 處理網絡接收數據 data
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章