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

C++下輕量化websocket客戶端庫(kù)——easywsclient的使用

這篇具有很好參考價(jià)值的文章主要介紹了C++下輕量化websocket客戶端庫(kù)——easywsclient的使用。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

1、背景介紹

1.1 WebSocket介紹

WebSocket 是 HTML5 開(kāi)始提供的一種在單個(gè) TCP 連接上進(jìn)行全雙工通訊的協(xié)議。

WebSocket 使得客戶端和服務(wù)器之間的數(shù)據(jù)交換變得更加簡(jiǎn)單,允許服務(wù)端主動(dòng)向客戶端推送數(shù)據(jù)。在 WebSocket API 中,瀏覽器和服務(wù)器只需要完成一次握手,兩者之間就直接可以創(chuàng)建持久性的連接,并進(jìn)行雙向數(shù)據(jù)傳輸。
c++ websocket 客戶端,python、C++與C#實(shí)踐,c++,websocket,開(kāi)發(fā)語(yǔ)言

在 WebSocket API 中,瀏覽器和服務(wù)器只需要做一個(gè)握手的動(dòng)作,然后,瀏覽器和服務(wù)器之間就形成了一條快速通道。兩者之間就直接可以數(shù)據(jù)互相傳送。

1.2 WebSocket 屬性

連接狀態(tài)屬性

以下是 WebSocket 對(duì)象的屬性:
0 - 表示連接尚未建立。
1 - 表示連接已建立,可以進(jìn)行通信。
2 - 表示連接正在進(jìn)行關(guān)閉。
3 - 表示連接已經(jīng)關(guān)閉或者連接不能打開(kāi)。

Socket.bufferedAmount
只讀屬性 bufferedAmount 為T(mén)rue表示信息已被 send() 放入正在隊(duì)列中等待傳輸,但是還沒(méi)有發(fā)出的 UTF-8 文本字節(jié)數(shù)。

WebSocket 事件

以下是 WebSocket 對(duì)象的相關(guān)事件:
事件 事件處理程序 描述
open Socket.onopen 連接建立時(shí)觸發(fā)
message Socket.onmessage 客戶端接收服務(wù)端數(shù)據(jù)時(shí)觸發(fā)
error Socket.onerror 通信發(fā)生錯(cuò)誤時(shí)觸發(fā)
close Socket.onclose 連接關(guān)閉時(shí)觸發(fā)

WebSocket 方法

以下是 WebSocket 對(duì)象的相關(guān)方法,用于信息發(fā)生與連接

方法 描述
Socket.send() //使用連接發(fā)送數(shù)據(jù)
Socket.close() //關(guān)閉連接

1.3 easywsclient介紹

websocket并不局限于在網(wǎng)頁(yè)端(JS客戶端使用),其還支持在各個(gè)后端中使用,如C++、Java等
easywsclient是一個(gè)基于C++11的輕量化標(biāo)注websocket客戶端庫(kù)(跨平臺(tái),支持各種系統(tǒng)),支持RFC 6455版本13 WebSocket,兼容現(xiàn)行所有的WebSocket服務(wù)器(如c++ crow庫(kù)的WebSocket服務(wù)端)。對(duì)于socketio的服務(wù)器兼容存在問(wèn)題,應(yīng)使用socketio的客戶端。
項(xiàng)目地址: https://github.com/dhbaird/easywsclient

2、easywsclient使用

2.1 代碼介紹

easywsclient項(xiàng)目核心代碼為"easywsclient.hpp"和"easywsclient.cpp",僅需將這兩個(gè)文件拷貝到自己項(xiàng)目下即可使用WebSocket客戶端通信了。
其關(guān)鍵接口函數(shù)有以下4個(gè),send函數(shù)用于發(fā)送文本信息,sendBinary函數(shù)用于發(fā)送二進(jìn)制信息,dispatch用于設(shè)置信息接收處理的函數(shù)

        ws->poll();
        ws->send("hello");
        //ws->sendBinary(vp);
        ws->dispatch(handle_message);

2.2 基本使用

使用easywsclient主要是要指定dispatch函數(shù),可以在dispatch函數(shù)中對(duì)服務(wù)器返回的信息進(jìn)行處理,也可以在此處斷開(kāi)WebSocket連接

#include "easywsclient.hpp"
//#include "easywsclient.cpp" // <-- include only if you don't want compile separately
using easywsclient::WebSocket;
WebSocket::pointer ws;
void handle_message_close(const std::string& message)
{
    ws->close();
}
int
main()
{
#ifdef _WIN32
    INT rc;
    WSADATA wsaData;

    rc = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (rc) {
        printf("WSAStartup Failed.\n");
        return 1;
    }
#endif
    ws = WebSocket::from_url("ws://localhost:8126/foo");
    assert(ws);
    while (websocketclient->getReadyState() != WebSocket::CLOSED) {
        ws->poll();
        ws->send("hello");
        ws->dispatch(handle_message_close);
    }
    ...
    delete ws; // alternatively, use unique_ptr<> if you have C++11

#ifdef _WIN32
    WSACleanup();
#endif
    return 0;
}

2.3 發(fā)送二進(jìn)制數(shù)據(jù)

需要調(diào)用sendBinary函數(shù),其入?yún)閟td::vector<uint8_t>類型。其支持將多種數(shù)據(jù)類型進(jìn)行拼接,允許一次性傳入多個(gè)數(shù)據(jù)(使用memcpy將數(shù)據(jù)復(fù)制到對(duì)應(yīng)內(nèi)存位置即可)。

        long dsize =  sizeof(int) +sizeof(char) * txt_data.size() ;
        uint8_t* buffer; 
        buffer = (uint8_t*)malloc(sizeof(uint8_t) * dsize);
        memcpy(buffer, 123456, sizeof(int));
        memcpy(buffer+sizeof(int), txt_data.data(), sizeof(char)*txt_data.size());
        std::vector<uint8_t> vp(buffer, buffer + dsize);

        ws->poll();
        ws->sendBinary(vp);

        //可以將二進(jìn)制數(shù)據(jù)保存下來(lái),與服務(wù)器端進(jìn)行驗(yàn)證
        ofstream fout("send.dat", ios::binary);
        fout.write(reinterpret_cast<const char*>(buffer), sizeof(uint8_t) * dsize);
        fout.close();

3、websocket服務(wù)器

在c++下搭建websocket服務(wù)器需要依賴其他的第三方庫(kù),這里初略介紹一下2個(gè)可以實(shí)現(xiàn)websocket服務(wù)器的c++庫(kù)

3.1 使用websocketpp庫(kù)

websocketpp庫(kù)下載地址為:https://github.com/zaphoyd/websocketpp/,其依賴Boost庫(kù)。故此,在導(dǎo)入websocketpp庫(kù)前,需要先導(dǎo)入Boost庫(kù)。websocketpp庫(kù)也支持websocket客戶端,但考慮到依賴的庫(kù)更多了,還是推薦使用easywsclient庫(kù)

#include <websocketpp/config/asio_no_tls.hpp>
 
#include <websocketpp/server.hpp>
 
#include <iostream>
 
typedef websocketpp::server<websocketpp::config::asio> server;
 
using websocketpp::lib::placeholders::_1;
using websocketpp::lib::placeholders::_2;
using websocketpp::lib::bind;
 
// pull out the type of messages sent by our config
typedef server::message_ptr message_ptr;
 
// Define a callback to handle incoming messages
void on_message(server* s, websocketpp::connection_hdl hdl, message_ptr msg) {
    std::string cmd = msg->get_payload();
    std::string res = "fu wu qi de xin xi! \" ";
 
    std::cout << "on_message called with hdl: " << hdl.lock().get()
              << " and message: " << msg->get_payload()
              << std::endl;
 
    // check for a special command to instruct the server to stop listening so
    // it can be cleanly exited.
    if (msg->get_payload() == "stop-listening") {
        s->stop_listening();
        return;
    }
 
    try {
        s->send(hdl, res, msg->get_opcode());
    } catch (websocketpp::exception const & e) {
        std::cout << "Echo failed because: "
                  << "(" << e.what() << ")" << std::endl;
    }
}
 
int main() {
    // Create a server endpoint
    server echo_server;
 
    try {
        // Set logging settings
        echo_server.set_access_channels(websocketpp::log::alevel::all);
        echo_server.clear_access_channels(websocketpp::log::alevel::frame_payload);
 
        // Initialize Asio
        echo_server.init_asio();
 
        // Register our message handler
        echo_server.set_message_handler(bind(&on_message,&echo_server,::_1,::_2));
 
        // Listen on port 9002
        echo_server.listen(9002);
 
        // Start the server accept loop
        echo_server.start_accept();
 
        // Start the ASIO io_service run loop
        echo_server.run();
    } catch (websocketpp::exception const & e) {
        std::cout << e.what() << std::endl;
    } catch (...) {
        std::cout << "other exception" << std::endl;
    }
}

詳情可以參考:https://hpg123.blog.csdn.net/article/details/124888325

3.2 使用crow庫(kù)

corw是一個(gè)開(kāi)源、輕量化的c++web庫(kù),在使用上與python的flask是類似的,其支持路由綁定、返回?cái)?shù)據(jù)(json、文本、response對(duì)象(靜態(tài)資源、模板文件)、接口請(qǐng)求處理(REST請(qǐng)求,url參數(shù)綁定、json請(qǐng)求、GET參數(shù)和POST
參數(shù))和各種高級(jí)操作(Cookie操作、Session操作、文件上傳操作、文件下載操作、websocket
操作、自定義loghandler)。此外,還對(duì)各類參數(shù)請(qǐng)求、結(jié)果返回過(guò)程中對(duì)中文的支持(如get
參數(shù)、post參數(shù)、url參數(shù)、json結(jié)果中中文參數(shù)的正確解讀)。其使用文檔的下載地址為:https://download.csdn.net/download/a486259/87471152文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-651932.html

#include "crow.h"
#include <unordered_set>
#include <mutex>
int main()
{
	crow::SimpleApp app;
	std::mutex mtx;
	std::unordered_set<crow::websocket::connection*> users;
	CROW_WEBSOCKET_ROUTE(app, "/ws")
		.onopen([&](crow::websocket::connection& conn) {
			CROW_LOG_INFO << "new websocket connection from " << conn.get_remote_ip();
			std::lock_guard<std::mutex> _(mtx);
			users.insert(&conn);
		})
		.onclose([&](crow::websocket::connection& conn, const std::string& reason) {
			CROW_LOG_INFO << "websocket connection closed: " << reason;
			std::lock_guard<std::mutex> _(mtx);
			users.erase(&conn);
		})
		.onmessage([&](crow::websocket::connection& /*conn*/, const std::string& data, bool is_binary){
			std::lock_guard<std::mutex> _(mtx);
			//給當(dāng)前用戶發(fā)信息
			conn.send_text(data);
			//給所有用戶發(fā)信息
			for (auto u : users){
			if (is_binary){
			u->send_binary(data);
			}else{
			u->send_text(data);
	});
	CROW_ROUTE(app, "/")
	([] {
		char name[256];
		gethostname(name, 256);
		crow::mustache::context x;
		x["servername"] = name;
		auto page = crow::mustache::load("ws.html");
		return page.render(x);
	});
}

到了這里,關(guān)于C++下輕量化websocket客戶端庫(kù)——easywsclient的使用的文章就介紹完了。如果您還想了解更多內(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ù)端客戶端(基于boost,親測(cè)可行!)

    ?? 整篇文章基本參考了https://blog.csdn.net/jianghuan0122/article/details/123528907,文章記錄了如何在現(xiàn)有條件下實(shí)現(xiàn)該參考示例(參考示例存在報(bào)錯(cuò),并且參考示例沒(méi)有介紹環(huán)境安裝,正確源碼附于文末) ?? 自身環(huán)境:ubuntu18.04+gcc7.5.0+boost1.7,3 ??gcc或者g++一般都有,這里主要介紹

    2024年02月11日
    瀏覽(19)
  • Java WebSocket客戶端

    1.依賴 2.代碼 1.依賴 2.代碼 2.1 自定義 websocket handler 2.2 將websocket handler加入容器 2.3 定時(shí)器監(jiān)控

    2024年02月16日
    瀏覽(22)
  • 客戶端 WebSocket詳細(xì)用法

    WebSocket是一種網(wǎng)絡(luò)通信協(xié)議,很多高級(jí)功能都需要用到它。 有些人會(huì)想,既然我們已經(jīng)有了HTTP協(xié)議了,為什么還要花時(shí)間學(xué)另一種協(xié)議呢?這個(gè)協(xié)議到底有什么魔力,值得我們花時(shí)間學(xué)它。 因?yàn)?HTTP 協(xié)議有一個(gè)缺陷:通信只能由客戶端發(fā)起。只能是客戶端向服務(wù)器發(fā)出請(qǐng)求

    2024年02月04日
    瀏覽(18)
  • SpringBoot WebSocket做客戶端

    常見(jiàn)的都是springboot應(yīng)用做服務(wù),前端頁(yè)面做客戶端,進(jìn)行websocket通信進(jìn)行數(shù)據(jù)傳輸交互。但其實(shí)springboot服務(wù)也能做客戶端去連接別的webSocket服務(wù)提供者。 剛好最近在項(xiàng)目中就使用到了,需求背景大概就是我們作為一個(gè)java段應(yīng)用需要和一個(gè)C語(yǔ)言應(yīng)用進(jìn)行通信。在項(xiàng)目需求及

    2024年02月11日
    瀏覽(24)
  • websocket客戶端實(shí)現(xiàn)(java)

    其中,headers 參數(shù)是一個(gè)鍵值對(duì),表示需要設(shè)置的請(qǐng)求頭。在構(gòu)造函數(shù)中,我們首先創(chuàng)建了一個(gè) ClientEndpointConfig.Configurator 對(duì)象,重寫(xiě)了其中的 beforeRequest() 方法,用于在請(qǐng)求之前設(shè)置請(qǐng)求頭。然后,我們使用 ClientEndpointConfig.Builder.create() 方法創(chuàng)建一個(gè) ClientEndpointConfig 對(duì)象,并

    2024年02月15日
    瀏覽(26)
  • Java實(shí)現(xiàn)websocket客戶端

    常規(guī)情況下,大多數(shù)時(shí)候Java后臺(tái)作為websocket服務(wù)端,實(shí)現(xiàn)方式也比較簡(jiǎn)單,網(wǎng)上很多案例代碼。但是很多時(shí)候項(xiàng)目中服務(wù)與服務(wù)之間也需要使用websocket通信,此時(shí)項(xiàng)目就需要實(shí)現(xiàn)客戶端功能。 步驟一:導(dǎo)入依賴: 步驟二:實(shí)現(xiàn)WebSocketClient抽象類: 該類中和websocket服務(wù)端接口

    2024年02月16日
    瀏覽(86)
  • 做個(gè)小工具-WebSocket客戶端

    做個(gè)小工具-WebSocket客戶端

    由于工作的原因經(jīng)常需要用到一些socket,串口等調(diào)試工具,但是好多工具要么只有其中幾個(gè)或者各種收費(fèi),不斷提醒捐助等。所以還是自己做一個(gè)吧。畢竟也不復(fù)雜。今天先做個(gè)WebSocket客戶端。WebSocket使用了開(kāi)源組件WatsonWebsocket。 先上圖 View的代碼 ViewModel的代碼 servervice的代

    2024年02月15日
    瀏覽(22)
  • 快速搭建springboot websocket客戶端

    快速搭建springboot websocket客戶端

    WebSocket 是 HTML5 開(kāi)始提供的一種在單個(gè) TCP 連接上進(jìn)行全雙工通訊的協(xié)議。 HTML5 定義的 WebSocket 協(xié)議,能更好的節(jié)省服務(wù)器資源和帶寬,并且能夠更實(shí)時(shí)地進(jìn)行通訊。 HTML5 定義的 WebSocket 協(xié)議,能更好的節(jié)省服務(wù)器資源和帶寬,并且能夠更實(shí)時(shí)地進(jìn)行通訊。 瀏覽器通過(guò) JavaSc

    2024年02月06日
    瀏覽(25)
  • SpringBoot+WebSocket實(shí)現(xiàn)服務(wù)端、客戶端

    SpringBoot+WebSocket實(shí)現(xiàn)服務(wù)端、客戶端

    小編最近一直在使用springboot框架開(kāi)發(fā)項(xiàng)目,畢竟現(xiàn)在很多公司都在采用此框架,之后小編也會(huì)陸續(xù)寫(xiě)關(guān)于springboot開(kāi)發(fā)常用功能的文章。 什么場(chǎng)景下會(huì)要使用到websocket的呢? websocket主要功能就是實(shí)現(xiàn)網(wǎng)絡(luò)通訊,比如說(shuō)最經(jīng)典的客服聊天窗口、您有新的消息通知,或者是項(xiàng)目與

    2024年02月13日
    瀏覽(26)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包