QTcpSocketネットワークソケット通信

サーバー側とクライアント側を実現し、受信方式はスロット受信方式を採用し、公式文書は処理中にF1F2で閲覧できます。

サーバ

新しいクラス、基本クラスを選択

ソースファイル

.hファイル

#ifndef SOCKET_H
#define SOCKET_H


#include <QObject>
#include <qtcpserver.h>
#include <qtcpsocket.h>


class socket : public QObject
{
    Q_OBJECT
public:
    explicit socket(int port,QObject *parent = nullptr);


    QTcpServer *tcpServer;
    QTcpSocket *tcpSocket;
    void WriteData(QByteArray bytes);
public slots:
    void acceptConnection();
    void readData();
};


#endif // SOCKET_H

.cppファイル

#include "socket.h"


socket::socket(int port, QObject *parent) : QObject(parent)
{
    tcpServer = new QTcpServer();
    tcpServer->listen(QHostAddress::Any,port);
    tcpSocket = nullptr;
    connect(tcpServer,SIGNAL(newConnection()),this,SLOT(acceptConnection()));
}


void socket::acceptConnection(){
    qDebug()<<"connect";
    tcpSocket = tcpServer->nextPendingConnection();
    connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(readData()));
    connect(tcpSocket, &QAbstractSocket::disconnected,tcpSocket, &QObject::deleteLater);
}


void socket::readData(){
    QByteArray bytes = tcpSocket->readAll();
    qDebug()<<bytes;
}


void socket::WriteData(QByteArray bytes){
    if(tcpSocket->isOpen()){
        tcpSocket->write(bytes);
    }
}

注意点

  1. 2つのヘッダーファイルqtcpserver.hとqtcpsocket.hを引用する必要があります。そのうちの2つには、サーバーとクライアントが含まれています。
  2. サーバーは接続を待機しており、readyData信号内に通信するためにソケットを使用する必要がある接続があります
  3. メインインターフェイスで使用法が初期化されると、socket * m = new socket(6789);

クライアント

サーバーと同じように、新しいクラスを作成し、基本クラスを選択します

ソースファイル

.cpp

#include "socket.h"
#include "servo.h"
#include "vrep.h"


socket::socket(QObject *parent) : QObject(parent)
{
    tcpSocket = new QTcpSocket(parent);
    connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(readData()));
}


void socket::ConnectServer(const QString &hostName,int port){
    tcpSocket->connectToHost(hostName,port);
}
void socket::readData(){
    QByteArray bytes = tcpSocket->readAll();
    qDebug()<<bytes;
}


void socket::WriteData(QByteArray bytes){
    if(tcpSocket!=nullptr && tcpSocket->isOpen()){
        tcpSocket->write(bytes);
    }
    else
        qDebug()<<"disconnection";
}

.h

#ifndef SOCKET_H
#define SOCKET_H


#include <QObject>
#include <qtcpserver.h>
#include <qtcpsocket.h>

class socket : public QObject
{
    Q_OBJECT
public:
    explicit socket(QObject *parent = nullptr);


    QByteArray m_bytes;
    QTcpSocket *tcpSocket;


    void ConnectServer(const QString &hostName,int port);
    void WriteData(QByteArray bytes);
    uint8_t getCheck(QByteArray bytes);
private:
    int receiveLength;
public slots:
    void readData();
};

#endif // SOCKET_H

注意

インスタンス化は、アクセス可能なUIスレッドにある必要があります

m_socket = new socket(this);

おすすめ

転載: blog.csdn.net/shaynerain/article/details/106130986