国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

(二) 用QWebSocket 實(shí)現(xiàn)服務(wù)端和客戶端(詳細(xì)代碼直接使用)

這篇具有很好參考價(jià)值的文章主要介紹了(二) 用QWebSocket 實(shí)現(xiàn)服務(wù)端和客戶端(詳細(xì)代碼直接使用)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

目錄

前言

一、服務(wù)器的代碼:

1、服務(wù)器的思路

2、具體服務(wù)器的代碼示例

二、客戶端的代碼:

1、客戶端的思路(和服務(wù)器類似)

2、具體客戶端的代碼示例


前言

????????要是想了解QWebSocket的詳細(xì)知識(shí),還得移步到上一篇文章:


WebSocket 詳解,以及用QWebSocket 實(shí)現(xiàn)服務(wù)端和客戶端(含代碼例子)-CSDN博客

????????本篇文章主要講解如何利用QWebSocket?實(shí)現(xiàn)服務(wù)和客戶之間的通訊

一、服務(wù)器的代碼:

1、服務(wù)器的思路

(1)首先創(chuàng)建了一個(gè)服務(wù)器的基類,主要實(shí)現(xiàn)了服務(wù)類的基本接口:

1、創(chuàng)建服務(wù)器:new QWebSocketServer
2、監(jiān)聽(tīng):listen
m_pWebSocketServer->listen(QHostAddress::LocalHost, mPort);//端口號(hào)
3、有新的連接,收到這個(gè)信號(hào):QWebSocketServer::newConnection
4、獲得新的客戶端:nextPendingConnection?
5、接收到信息時(shí)候,收到信號(hào):QWebSocket::binaryMessageReceived?
6、斷開(kāi)連接,收到信號(hào):QWebSocket::disconnected

注意:數(shù)據(jù)的接收和發(fā)送,有兩種格式,二進(jìn)制和文本的,具體按照實(shí)際需要的來(lái)選擇;

(2)在服務(wù)器的基類上,封裝一個(gè)具體使用的類,這個(gè)類,主要是添加了QThread,創(chuàng)建一個(gè)子線程來(lái)進(jìn)行服務(wù)器的開(kāi)啟,監(jiān)聽(tīng)和接收數(shù)據(jù),不會(huì)影響主線程的事件。

2、具體服務(wù)器的代碼示例

????????接收和發(fā)送的數(shù)據(jù),以二進(jìn)制為例

(1)服務(wù)器基類:

服務(wù)器基類的頭文件:

? ? ? ? 1)開(kāi)啟一個(gè)端口號(hào)為“9000”的服務(wù)器

? ? ? ? 2)監(jiān)聽(tīng)的網(wǎng)路是:QHostAddress::Any

QHostAddress::Any表示服務(wù)端監(jiān)聽(tīng)所有可用的網(wǎng)絡(luò)接口。
它是一個(gè)特殊的IP地址,表示服務(wù)端可以接受來(lái)自任何IP地址的連接請(qǐng)求。
這通常用于在一個(gè)計(jì)算機(jī)上運(yùn)行多個(gè)網(wǎng)絡(luò)服務(wù)時(shí),讓服務(wù)端能夠監(jiān)聽(tīng)所有可用的網(wǎng)絡(luò)接口,

以便接受來(lái)自不同網(wǎng)絡(luò)接口的連接請(qǐng)求。

注意:也可以監(jiān)聽(tīng)具體的IP地址:

例如:QHostAddress(strLocalHostIp)

#ifndef WEBSOCKETSERVERBASE_H
#define WEBSOCKETSERVERBASE_H

#include <QObject>
#include <QtWebSockets>

QT_FORWARD_DECLARE_CLASS(QWebSocketServer)
QT_FORWARD_DECLARE_CLASS(QWebSocket)
QT_FORWARD_DECLARE_CLASS(QString)

class WebsocketServerBase : public QObject
{
    Q_OBJECT
public:
    explicit WebsocketServerBase(QString serverName,  quint16 port, QObject *parent = 0);
    virtual ~WebsocketServerBase();

signals:
    //客戶端發(fā)來(lái)的數(shù)據(jù)
    void sigProcessServerMessage(const QByteArray &data);

public slots:
    //發(fā)送數(shù)據(jù)給客戶端
    void slotSendToAllClients(const QByteArray &data);

    //啟動(dòng)websocket服務(wù)器
    void slotStartServer();

private slots:
    //處理新接入的連接
    void slotNewConnection();

    //處理鏈接斷開(kāi)的事件
    void slotSocketDisconnected();

    //接收數(shù)據(jù),并轉(zhuǎn)發(fā)
    void slotProcessBinaryMessage(const QByteArray &message);

public:
    //檢測(cè)是否存在客戶端
    bool hadClients();

private:
    QWebSocketServer *m_pWebSocketServer = nullptr;
    QList<QWebSocket *> m_clients;

    unsigned short m_nPort = 9000;
    QString m_strServerName = "server";
};

#endif // WEBSOCKETSERVERBASE_H

服務(wù)器基類的源文件:

#include "websocketserverbase.h"

#include<QDebug>

static QString getIdentifier(QWebSocket *peer)
{
    return QStringLiteral("%1:%2").arg(peer->peerAddress().toString(),
                                       peer->origin());
}

WebsocketServerBase::WebsocketServerBase(QString serverName,  quint16 port, QObject *parent)
    : QObject(parent)
    ,m_nPort(port)
    ,m_strServerName(serverName)
{
}

WebsocketServerBase::~WebsocketServerBase()
{   
    if(m_pWebSocketServer)
    {
        m_pWebSocketServer->close();
        //m_pWebSocketServer->abort();
        m_pWebSocketServer->deleteLater();
    }
}

//接收到外部發(fā)來(lái)的信息,轉(zhuǎn)發(fā)給客戶端
void WebsocketServerBase::slotSendToAllClients(const QByteArray &data)
{
    qDebug() << __FUNCTION__;

    for (QWebSocket *pClient : qAsConst(m_clients)) {
        qDebug() << "data: " << data;
         pClient->sendBinaryMessage(data);
    }
}

bool WebsocketServerBase::hadClients()
{
    return m_clients.size()>0;
}

void WebsocketServerBase::slotStartServer()
{
    if(m_pWebSocketServer)
        return;

    m_pWebSocketServer = new QWebSocketServer(m_strServerName, QWebSocketServer::NonSecureMode, this);

    if (m_pWebSocketServer->listen(QHostAddress::Any, m_nPort))
    {
        connect(m_pWebSocketServer, &QWebSocketServer::newConnection, this, &WebsocketServerBase::slotNewConnection);
        qDebug() << "WebSocket is start, port:" << m_nPort;
    }
}

void WebsocketServerBase::slotNewConnection()
{
    auto pSocket = m_pWebSocketServer->nextPendingConnection();
    QTextStream(stdout) << getIdentifier(pSocket) << " connected!\n";

    qDebug() << "client connected!";

    pSocket->setParent(this);

	//二進(jìn)制數(shù)據(jù)的接收
    connect(pSocket, &QWebSocket::binaryMessageReceived, this, &WebsocketServerBase::slotProcessBinaryMessage);
    connect(pSocket, &QWebSocket::disconnected, this, &WebsocketServerBase::slotSocketDisconnected);

    m_clients << pSocket;
}

void WebsocketServerBase::slotSocketDisconnected()
{
	QWebSocket *pClient = qobject_cast<QWebSocket *>(sender());
	QTextStream(stdout) << getIdentifier(pClient) << " disconnected!\n";
	if (pClient)
	{
		m_clients.removeAll(pClient);
		pClient->deleteLater();
	}
}

//接收客戶端發(fā)來(lái)的數(shù)據(jù),并轉(zhuǎn)發(fā)出去
void WebsocketServerBase::slotProcessBinaryMessage(const QByteArray &data)
{
    qDebug() << __FUNCTION__ << " data:" << data;
    emit sigProcessServerMessage(data);

    //test
    //slotSendToAllClients(data);
}

(2)將服務(wù)器基類封裝,改造下:(外面可以直接使用這個(gè)類進(jìn)行通訊)

改造后服務(wù)器的頭文件:

????????此處本例是使用回調(diào)函數(shù)將結(jié)果拋給上一層調(diào)用者,在qt里,完全可以用信號(hào)槽代替的。

#ifndef READERWEBSOCKETSERVER_H
#define READERWEBSOCKETSERVER_H

#include <QObject>
#include "Singleton.h"


// 回調(diào)函數(shù),將websocket的結(jié)果拋給上層
typedef void(*recvMsgToSerial)(const QByteArray &byteArray);

class WebsocketServerBase;
class ReaderWebsocketServer : public QObject, public Singleton<ReaderWebsocketServer>
{
    Q_OBJECT
    friend class Singleton<ReaderWebsocketServer>;

public:
    explicit ReaderWebsocketServer(QObject *parent = 0);
    virtual ~ReaderWebsocketServer();

public:
    // 設(shè)置回調(diào)函數(shù)
    void setCallBack(recvMsgToSerial pFunc, void* pUser = NULL);

    // 接收串口發(fā)來(lái)數(shù)據(jù),轉(zhuǎn)發(fā)給客戶端
    bool sendData(const QByteArray &byteArray);

signals:
	//轉(zhuǎn)發(fā)數(shù)據(jù)給客戶端
    void sigSendToAllClients(const QByteArray &data);

private slots:
    //處理客戶端發(fā)來(lái)的數(shù)據(jù),轉(zhuǎn)發(fā)給需要的地方
    void slotProcessServerMessage(const QByteArray &data);

private:
    WebsocketServerBase* m_pWsServer = nullptr;
    QThread* m_thdWsServer = nullptr;

    void* m_pUser;							// 返回回調(diào)的對(duì)象
    recvMsgToSerial m_pRecvMsgToSerial;		// 回調(diào)
};

#endif // READERWEBSOCKETSERVER_H

改造后服務(wù)器的源文件:

#include "readerwebsocketserver.h"

#include <QThread>
#include <cstring>
#include "websocketserverbase.h"

ReaderWebsocketServer::ReaderWebsocketServer(QObject *parent)
    : QObject(parent)
{
    m_thdWsServer = new QThread();
    m_pWsServer = new WebsocketServerBase("reader", 9000);
    m_pWsServer->moveToThread(m_thdWsServer);

    connect(m_pWsServer, &WebsocketServerBase::sigProcessServerMessage, this, &ReaderWebsocketServer::slotProcessServerMessage);
    connect(this, &ReaderWebsocketServer::sigSendToAllClients, m_pWsServer, &WebsocketServerBase::slotSendToAllClients);

    connect(m_thdWsServer, &QThread::started, m_pWsServer, &WebsocketServerBase::slotStartServer);
    connect(m_thdWsServer, &QThread::finished, m_pWsServer, &WebsocketServerBase::deleteLater);
    connect(m_thdWsServer, &QThread::finished, m_thdWsServer, &WebsocketServerBase::deleteLater);
    m_thdWsServer->start();
}

ReaderWebsocketServer::~ReaderWebsocketServer()
{
    if(m_thdWsServer)
    {
        m_thdWsServer->quit();
        m_thdWsServer->wait();
    }

    if(m_pWsServer)
    {
        m_pWsServer->deleteLater();
    }
}

void ReaderWebsocketServer::setCallBack(recvMsgToSerial pFunc, void *pUser)
{
    if (nullptr != pFunc)
        m_pRecvMsgToSerial = pFunc;

    if (nullptr != pUser)
        m_pUser = pUser;
}

//接收串口發(fā)來(lái)數(shù)據(jù),轉(zhuǎn)發(fā)給客戶端
bool ReaderWebsocketServer::sendData(const QByteArray &byteArray)
{
    bool hadBnode = m_pWsServer->hadClients();
    if (hadBnode)
    {
        emit sigSendToAllClients(byteArray);
    }
}

//處理客戶端發(fā)來(lái)的數(shù)據(jù),轉(zhuǎn)發(fā)給需要的地方
void ReaderWebsocketServer::slotProcessServerMessage(const QByteArray &byteArray)
{
    qDebug() << __FUNCTION__ ;
    m_pRecvMsgToSerial(byteArray);
}

二、客戶端的代碼:

1、客戶端的思路(和服務(wù)器類似)

(1)首先創(chuàng)建了一個(gè)客戶端的基類,主要實(shí)現(xiàn)了客戶端的基本接口:

(2)在客戶端基類上,封裝一個(gè)具體使用的類:(外面可以直接使用這個(gè)類進(jìn)行通訊)

????????這個(gè)類,主要是添加了QThread 和QTimer,QThread 創(chuàng)建一個(gè)子線程來(lái)進(jìn)行服務(wù)器的開(kāi)啟,監(jiān)聽(tīng)和接收數(shù)據(jù),不會(huì)影響主線程的事件;QTimer主要是發(fā)心跳包,實(shí)現(xiàn)斷開(kāi)重連機(jī)制;

2、具體客戶端的代碼示例

????????接收和發(fā)送的數(shù)據(jù),以二進(jìn)制為例

(1)客戶端基類:

客戶端基類的頭文件:

/*
 * @Description: websocket客戶端,用于與中間件通信
 */

#pragma once
#include <QObject>
#include <QByteArray>

class QTimer;
class QWebSocket;
class WebSocketBase : public QObject
{
    Q_OBJECT
public:
    WebSocketBase(QObject *parent = nullptr);
    ~WebSocketBase();

    void setWebSocketUrl(QString strUrl="");
    bool getConnectStatus();
    int RecvFrom(QByteArray& byteArray);

signals:
    void sigClientBinaryMessageReceived(const QByteArray &byteArray); //借用websocket的信號(hào)函數(shù)

public slots:
    void slotCreateDataRecWS();//創(chuàng)建websocket連接
    void slotSendBinaryMessageMessage(const QByteArray &byteArray);
    void slotReconnect();           /*-<周期重連函數(shù) */
    void slotActiveReconnect();

private slots:
    void slotOnConnected();                 /*-<socket建立成功后,觸發(fā)該函數(shù) */
    void slotOnBinaryMessageReceived(const QByteArray &byteArray);   /*-<收到Sev端的數(shù)據(jù)時(shí),觸發(fā)該函數(shù) */
    void slotOnDisConnected();              /*-<socket連接斷開(kāi)后,觸發(fā)該函數(shù) */

private:
    QWebSocket *m_pDataRecvWS;     /*-<websocket類 */
    QTimer *m_pTimer;            /*-<周期重連Timer */
    QString m_strURL;              /*連接URL*/
    bool m_bConnectStatus;         /*-<websocket連接狀態(tài),連接成功:true;斷開(kāi):false */
    QByteArray m_byteArray;
};

客戶端基類的源文件:

#include "WebSocketBase.h"
#include <QWebSocket>
#include <QTimer>
#include <QByteArray>
#include <cstring>

WebSocketBase::WebSocketBase(QObject *parent) : QObject(parent)
  ,m_pDataRecvWS(nullptr)
  ,m_pTimer(nullptr)
  ,m_strURL("")
  ,m_bConnectStatus(false)
  ,m_byteArray("")
{

}

WebSocketBase::~WebSocketBase()
{
    m_pTimer->stop();
    m_pTimer->deleteLater();
    m_pDataRecvWS->abort();
    m_pDataRecvWS->deleteLater();
}

void WebSocketBase::setWebSocketUrl(QString strUrl)
{
    m_strURL = strUrl;
    if(m_strURL.isEmpty())
    {
        m_strURL = "127.0.0.1";
    }
}

bool WebSocketBase::getConnectStatus()
{
    return m_bConnectStatus;
}

int WebSocketBase::RecvFrom(QByteArray &byteArray)
{
    byteArray = m_byteArray;
    m_byteArray.clear();
    return byteArray.size();
}

void WebSocketBase::slotCreateDataRecWS()
{
    if(nullptr == m_pTimer)
    {
        m_pTimer = new QTimer();
    }

    qDebug() << "Server Address" << m_strURL;

    if(m_pDataRecvWS == nullptr)
    {
        m_pDataRecvWS = new QWebSocket();
        connect(m_pDataRecvWS, &QWebSocket::disconnected, this, &WebSocketBase::slotOnDisConnected);
        connect(m_pDataRecvWS, &QWebSocket::binaryMessageReceived, this, &WebSocketBase::slotOnBinaryMessageReceived);
        connect(m_pDataRecvWS, &QWebSocket::connected, this, &WebSocketBase::slotOnConnected);
        connect(m_pTimer, &QTimer::timeout, this, &WebSocketBase::slotReconnect);
        m_pDataRecvWS->open(QUrl(m_strURL));
    }
}

void WebSocketBase::slotSendBinaryMessageMessage(const QByteArray &message)
{
    if (m_pDataRecvWS)
        m_pDataRecvWS->sendBinaryMessage(message);
}

void WebSocketBase::slotActiveReconnect()
{
    qDebug("try to Active Reconnect!!!");
    if(m_pDataRecvWS != nullptr)
    {
        m_bConnectStatus = false;
        m_pDataRecvWS->abort();
        qDebug("Exec Active Reconnect!");
        m_pDataRecvWS->open(QUrl(m_strURL));
    }

    return;
}

void WebSocketBase::slotReconnect()
{
    qDebug() << "try to reconnect:" << m_strURL;

    m_pDataRecvWS->abort();
    m_pDataRecvWS->open(QUrl(m_strURL));
}

void WebSocketBase::slotOnConnected()
{
    qDebug("WebSocketBase websocket is already connect!");

    m_bConnectStatus = true;
    m_pTimer->stop();
    qDebug() << "Address:" << m_strURL;
}

void WebSocketBase::slotOnDisConnected()
{
    qDebug() << "Address is disconnected:" << m_strURL;

    m_bConnectStatus = false;
    m_pTimer->start(3000);/*-<當(dāng)連接失敗時(shí),觸發(fā)重連計(jì)時(shí)器,設(shè)置計(jì)數(shù)周期為3秒 */
}

void WebSocketBase::slotOnBinaryMessageReceived(const QByteArray& byteArray)
{
    m_byteArray = byteArray;
}

(2)將客戶端基類封裝,改造下:(外面可以直接使用這個(gè)類進(jìn)行通訊)

改造后客戶端頭文件:

/*
 * @Description: websocket客戶端,用于與中間件通信
 */
#pragma once

#include <QObject>
#include <QCoreApplication>

#include "Singleton.h"

class WebSocketBase;
class QTimer;

class WsReaderClient : public QObject, public Singleton<WsReaderClient>
{
    Q_OBJECT
    friend class Singleton<WsReaderClient>;

public:
    WsReaderClient(QObject *parent = nullptr);
    ~WsReaderClient();

public:
    void SendTo(const QByteArray &byteArray);
    int RecvFrom(QByteArray& byteArray);

    bool getConnectStatus();

signals:
    //轉(zhuǎn)發(fā)數(shù)據(jù)給server
    void sigSendToServer(const QByteArray &byteArray);

public slots:
    //接收服務(wù)器數(shù)據(jù)
    void slotRecvServerData(const QByteArray &byteArray);

    //發(fā)送服務(wù)器心跳包
    void slotHeartBeatToServer();

private:
    void readConfig();

private:
    WebSocketBase* m_wsReaderClient;
    QThread* m_thdReaderClient;
    QTimer *m_pTimerReader;
    int m_nHeartBeatTimeOutReader;
    QString m_URL = "";
};

改造后客戶端源文件:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-807807.html

#include "WsReaderClient.h"

#include <QWebSocket>
#include <QTimer>
#include <QThread>
#include <QByteArray>
#include <cstring>
#include <QSettings>

#include "WebSocketBase.h"

WsReaderClient::WsReaderClient(QObject *parent)
    : QObject(parent)
{
    readConfig();

    m_thdReaderClient = new QThread();
    m_wsReaderClient = new WebSocketBase();
    m_wsReaderClient->setWebSocketUrl(m_URL);

    m_wsReaderClient->moveToThread(m_thdReaderClient);
    connect(m_thdReaderClient, &QThread::started, m_wsReaderClient, &WebSocketBase::slotCreateDataRecWS);
    connect(this, &WsReaderClient::sigSendToServer, m_wsReaderClient, &WebSocketBase::slotSendBinaryMessageMessage);
    //connect(this, &WsReaderClient::sigReconnectServer, m_wsReaderClient, &WebSocketBase::slotActiveReconnect);

    connect(m_thdReaderClient, &QThread::finished, m_wsReaderClient, &WebSocketBase::deleteLater);
    connect(m_thdReaderClient, &QThread::finished, m_thdReaderClient, &QThread::deleteLater);
    m_thdReaderClient->start();

    m_pTimerReader = new QTimer(this);
    connect(m_pTimerReader, &QTimer::timeout, this, &WsReaderClient::slotHeartBeatToServer);
    //m_nHeartBeatTimeOutKeyBoard = 0;
    m_pTimerReader->start(10*1000);
}

WsReaderClient::~WsReaderClient()
{
    m_pTimerReader->stop();
    m_pTimerReader->deleteLater();

    if(m_wsReaderClient)
    {
       delete m_wsReaderClient;
        m_wsReaderClient = nullptr;
    }

    if(m_pTimerReader)
    {
        delete m_pTimerReader;
        m_pTimerReader = nullptr;
    }
}

void WsReaderClient::slotHeartBeatToServer()
{
    //todo
}

void WsReaderClient::readConfig()
{
    // "/mnt/hgfs/SharedFiles/shanxi/Reader/linux_readerTest/bin/libReaderApi.so";
    QString appPath = QCoreApplication::applicationDirPath();
    qDebug() << "appPath=" << appPath;

    QString path = appPath + "/ReaderConfig.ini";
    QSettings settings(path, QSettings::IniFormat);
    m_URL = settings.value("Communication/ipAddr").toString();
    qDebug() << "m_URL=" << m_URL;
}

void WsReaderClient::SendTo(const QByteArray &data)
{
    emit sigSendToServer(data);
}

int WsReaderClient::RecvFrom(QByteArray &byteArray)
{
    return m_wsReaderClient->RecvFrom(byteArray);
}

bool WsReaderClient::getConnectStatus()
{
    return m_wsReaderClient->getConnectStatus();
}

到了這里,關(guān)于(二) 用QWebSocket 實(shí)現(xiàn)服務(wù)端和客戶端(詳細(xì)代碼直接使用)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • C++實(shí)現(xiàn)WebSocket通信(服務(wù)端和客戶端)

    C++實(shí)現(xiàn)WebSocket通信(服務(wù)端和客戶端)

    天行健,君子以自強(qiáng)不息;地勢(shì)坤,君子以厚德載物。 每個(gè)人都有惰性,但不斷學(xué)習(xí)是好好生活的根本,共勉! 文章均為學(xué)習(xí)整理筆記,分享記錄為主,如有錯(cuò)誤請(qǐng)指正,共同學(xué)習(xí)進(jìn)步。 這里單純是個(gè)人總結(jié),如需更官方更準(zhǔn)確的websocket介紹可百度 websocket是一種即時(shí)通訊協(xié)

    2024年02月09日
    瀏覽(19)
  • Golang實(shí)現(xiàn)之TCP長(zhǎng)連接-------服務(wù)端和客戶端

    一、數(shù)據(jù)包的數(shù)據(jù)結(jié)構(gòu) (所有字段采用大端序) 幀頭 幀長(zhǎng)度(頭至尾) 幀類型 幀數(shù)據(jù) 幀尾 1字節(jié) 4字節(jié) 2字節(jié) 1024字節(jié) 1字節(jié) byte int short string byte 0xC8 0xC9 二、Server端?實(shí)現(xiàn)代碼 1、main.go 2、server.go 3、protocol.go 4、response.go 5、result.go 三、Client端?實(shí)現(xiàn)代碼

    2024年02月07日
    瀏覽(23)
  • 【Qt專欄】Qt實(shí)現(xiàn)TCP服務(wù)端和客戶端通信

    【Qt專欄】Qt實(shí)現(xiàn)TCP服務(wù)端和客戶端通信

    網(wǎng)絡(luò)通信是程序員必須會(huì)的一項(xiàng)生存技能,這里簡(jiǎn)單的實(shí)現(xiàn)了服務(wù)端和客戶端通信的兩個(gè)小示例,代碼可以直接拿來(lái)用,開(kāi)發(fā)環(huán)境是Qt5.9.6。 1.項(xiàng)目架構(gòu) 2.tcpserver.h文件 3.tcpserver.cpp文件 4.測(cè)試效果 1.項(xiàng)目架構(gòu) 2.tcpserver.h文件 3.tcpserver.cpp文件 4.測(cè)試效果 好了,兩個(gè)小程序?qū)懲瓴?/p>

    2024年02月12日
    瀏覽(22)
  • SpringBoot+CAS整合服務(wù)端和客戶端實(shí)現(xiàn)SSO單點(diǎn)登錄與登出快速入門上手

    SpringBoot+CAS整合服務(wù)端和客戶端實(shí)現(xiàn)SSO單點(diǎn)登錄與登出快速入門上手

    教學(xué)講解視頻地址:視頻地址 因?yàn)镃AS支持HTTP請(qǐng)求訪問(wèn),而我們是快速入門上手視頻,所以這期教程就不教大家如何配置HTTPS了,如果需要使用HTTPS,可以參考其他博客去云服務(wù)器申請(qǐng)證書(shū)或者使用JDK自行生成一個(gè)證書(shū)。 下載CAS Server(直接下載壓縮包就可以) 這里我們用的是

    2024年02月02日
    瀏覽(18)
  • 《TCP/IP網(wǎng)絡(luò)編程》閱讀筆記--基于Windows實(shí)現(xiàn)Hello Word服務(wù)器端和客戶端

    《TCP/IP網(wǎng)絡(luò)編程》閱讀筆記--基于Windows實(shí)現(xiàn)Hello Word服務(wù)器端和客戶端

    目錄 1--Hello Word服務(wù)器端 2--客戶端 3--編譯運(yùn)行 3-1--編譯服務(wù)器端 3-2--編譯客戶端 3-3--運(yùn)行 運(yùn)行結(jié)果:

    2024年02月10日
    瀏覽(63)
  • Linux中UDP服務(wù)端和客戶端

    2024年02月13日
    瀏覽(22)
  • Nacos源碼 (5) Grpc服務(wù)端和客戶端

    Nacos 2.x在服務(wù)端與客戶端直接增加了GRPC通信方式,本文通過(guò)2.0.2版本源碼,簡(jiǎn)單分析GRPC通信方式: 服務(wù)器啟動(dòng) 客戶端連接 客戶端心跳 服務(wù)器監(jiān)控檢查 api/src/main/proto/nacos_grpc_service.proto文件: 文件定義了通信層的service和message結(jié)構(gòu),業(yè)務(wù)層請(qǐng)求響應(yīng)的序列化和反序列化是Na

    2024年02月10日
    瀏覽(60)
  • UDP服務(wù)端和客戶端通信代碼開(kāi)發(fā)流程

    UDP服務(wù)端和客戶端通信代碼開(kāi)發(fā)流程

    TCP: 傳輸控制協(xié)議,面向連接的,穩(wěn)定的,可靠的,安全的數(shù)據(jù)集流傳遞 穩(wěn)定和可靠:丟包重傳 數(shù)據(jù)有序:序號(hào)和確認(rèn)序號(hào) 流量控制:穩(wěn)定窗口 UDP :用戶數(shù)據(jù)報(bào)協(xié)議 面向無(wú)連接的,不穩(wěn)定的,不可靠,不安全的數(shù)據(jù)報(bào)傳遞=---更像是收發(fā)短信,UDP傳輸不需要建立連接,傳輸效率更高

    2024年02月06日
    瀏覽(22)
  • 網(wǎng)絡(luò)編程——socket服務(wù)端和客戶端(TCP)

    網(wǎng)絡(luò)編程——socket服務(wù)端和客戶端(TCP)

    所謂套接字(Socket),就是對(duì)網(wǎng)絡(luò)中不同主機(jī)上的應(yīng)用進(jìn)程之間進(jìn)行雙向通信的端點(diǎn)的抽象。一個(gè)套接字就是網(wǎng)絡(luò)上進(jìn)程通信的一端,提供了應(yīng)用層進(jìn)程利用網(wǎng)絡(luò)協(xié)議交換數(shù)據(jù)的機(jī)制。從所處的地位來(lái)講,套接字上聯(lián)應(yīng)用進(jìn)程,下聯(lián)網(wǎng)絡(luò)協(xié)議棧,是應(yīng)用程序通過(guò)網(wǎng)絡(luò)協(xié)議進(jìn)行通

    2024年02月07日
    瀏覽(153)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包