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
}

猜你喜欢

转载自blog.csdn.net/qq_33283417/article/details/80643083