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

C++下跨平臺(tái)websocket庫及使用示例

這篇具有很好參考價(jià)值的文章主要介紹了C++下跨平臺(tái)websocket庫及使用示例。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

websocketpp庫使用非常方便,開源,可跨平臺(tái),內(nèi)部實(shí)現(xiàn)全部是head文件,無cpp,接口簡單易用。源碼路徑比如?https://github.com/zaphoyd/websocketpp.git

使用方法是,先下載源碼包并復(fù)制道工程的include目錄下。

--include

? ?--websocketpp

然后在代碼#include "utility_client.hpp"即可調(diào)用其接口進(jìn)行websocket通信。以linux為例具體使用的方法代碼示例:

websockettalker.h:

#ifndef WEBSOCKETTALKER_H
#define WEBSOCKETTALKER_H
#include "dao.h"
#include "utility_client.hpp"
#include "pthread.h"
#include "vector"

using namespace std;
class CloudTalker;
class WebsocketTalker
{
public:
	WebsocketTalker(CloudTalker* talker, const string& remoteAddr, const string& name);
	~WebsocketTalker();
	string GetStatus();
	string GetMessage();
	bool Subscribe(const string& deviceId, const string& token);
	void handleNbData(const string& msg);

private:
	CloudTalker* mTalker;
	static void* thread_loop(void* pVoid);
	pthread_t recv_thread;
	websocket_endpoint mEndpoint;
	int mId;
	string addr = "";
	bool should_exit = false;
    vector<DevInfo> mImeiTable;
    DAO* mDevDbDao = NULL;
};

#endif // WEBSOCKETTALKER_H

websockettalker.cpp:

#include "websockettalker.h"
#include "cloudtalker.h"
#include "udptalker.h"
#include <boost/algorithm/string.hpp>

using namespace boost;
#define JSON_PATH_DEV "path/to/devDB.json"
WebsocketTalker::WebsocketTalker(CloudTalker* talker, const string& remoteAddr, const string& name)
{
	string messageclient;
	addr = "ws://" + remoteAddr + ":8081/webSocketServer?" + name; //格式為
	cout <<"full address is:" <<addr <<endl;
	mTalker = talker;
    mDevDbDao = new DAO();
	pthread_create(&recv_thread, nullptr, thread_loop, this);
}

/***********************************************************
* 描述: 處理數(shù)據(jù)
* 入?yún)? wholeMsg - 要處理的數(shù)據(jù)
* 出參: 無
* 返回: 無
************************************************************/
void WebsocketTalker::handleData(const string& wholeMsg)
{

	cout <<endl;

}



/***********************************************************
* 描述: websocket通信線程
* 入?yún)? pVoid - WebsocketTalker指針
* 出參: 無
* 返回: 無
************************************************************/
void* WebsocketTalker::thread_loop(void* pVoid)
{
	WebsocketTalker* p = (WebsocketTalker*) pVoid;
	string status = "";
	string wholeMsg = "";
	int cont = 0;
    unsigned int len = 0;
	while(!p->should_exit)
	{
        p->mImeiTable.clear();
		printf("WEBSOCKET WANT TO CREATE CONNECT FOR NBIOT DATA\n");
        p->mDevDbDao->getNBAndShareImeiAll(JSON_PATH_DEV, p->mImeiTable);
        len = p->mImeiTable.size();
        if(len == 0)
        {
            int cnt = 0;
            printf("nb/share dev list is zero\n");
            while(!p->should_exit && cnt++ <4)
            {
                usleep(500000);
            }
            cnt = 0;
            continue;
        }
		p->mId = p->mEndpoint.connect(p->addr);
		if (p->mId == -1)
		{
			cout << "Created connection failed! mId=" << p->mId<< endl;
		}
		else
		{
			while(!p->should_exit)
			{
				usleep(50000);

				status = p->GetStatus();
				if(status.length() && status != "Connecting")
					break;
			}
			if(p->should_exit)
			{
				printf("exit 1\n");
				break;
			}
            for(unsigned int i=0; i<len; i++)
            {
                cout<<"subscribe dev: " << p->mImeiTable[i].IMEi<< "with token: "<<p->mImeiTable[i].Token<<endl;
                p->Subscribe(p->mImeiTable[i].IMEi, p->mImeiTable[i].Token);
                cont = 0;
                while(!p->should_exit)
                {
                    usleep(50000);

                    status = p->GetStatus();
                    if(status == "Message")
                        break;
                    if(cont++ > 40)
                    {
                        printf("websocket data receive subscribe status timeout\n");
                        //cont = 0;
                        break;
                    }
                }
                if(p->should_exit || cont > 40)
                {
                    printf("exit 2\n");
                    break;
                }
                wholeMsg = p->GetMessage();
                printf("[%s(%d)%s] msg=%s\n", __FUNCTION__, __LINE__, __TIME__, wholeMsg.data());
                cont = 0;
                /*循環(huán)接收消息 */
                while(!p->should_exit)
                {
                    if(cont++ > 40)
                    {
                        printf("websocket data receive timeout\n");
                        //cont = 0;
                        break;
                    }
                    status = p->GetStatus();
                    //printf("get status: %s\n", status.c_str());
                    if(status == "Message")
                    {
                        wholeMsg = p->GetMessage();
                        printf("[%s(%d)%s;] GOT SUBSCRIBED DATA, msg=%s\n", __FUNCTION__, __LINE__, __TIME__, wholeMsg.data());
                        p->handleNbData(wholeMsg);
                        cont = 0;
                        break;
                    }
                    usleep(50000);
                }
                if(p->should_exit)
                {
                    printf("exit 3\n");
                    break;
                }

            }
			p->mEndpoint.close(p->mId, websocketpp::close::status::normal, "close");
			if(p->should_exit)
			{
				printf("exit 3\n");
				break;
			}
		}
		usleep(2000000);//sleep long time could be.
	}

	return NULL;
}
string WebsocketTalker::GetStatus()
{
	return mEndpoint.get_metadata(mId)->get_status();
}

string WebsocketTalker::GetMessage()
{
	return mEndpoint.get_metadata(mId)->get_message();
}


bool WebsocketTalker::Subscribe(const string& deviceId, const string& token)
{
	string str;

	str = "{\"type\":\"address\",\"msg\":\"" + deviceId + "\",\"token\":\"" + token +"\"}";
	printf("[%s(%d)] %s\n", __FUNCTION__, __LINE__, str.data());
	mEndpoint.send(mId, str);

	return true;
}


WebsocketTalker::~WebsocketTalker()
{
	printf("exit wstalker\n");
    if(mDevDbDao != NULL)
    {
        delete mDevDbDao;
    }
	should_exit = true;
	pthread_join(recv_thread, NULL);
	printf("exit wstalker done\n");
}


?dao.h:

#ifndef DAO_H
#define DAO_H

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include "json/json.h"

#ifndef UNUSED
#define UNUSED(x) (void)(x)
#endif

using namespace std;

typedef struct
{
    string IMEi;
    string Type;
    string Token;
}DevInfo;


class DAO{

public:
    DAO(){}

    // 10. get device information transform to <vector> from json, "device information contain {IMEI, type, token, index}"
    int getNBAndShareImeiAll(const char* dfile_path, vector<DevInfo>& imeiTable)
    {
        fstream dev_f;
        dev_f.open(dfile_path, ios::in | ios::out);
        if (!dev_f.is_open())
        {
            cout << "Open file error !" << endl;
        }

        Json::Value val;
        Json::Value root_arr;
        JSONCPP_STRING errs;
        //bool did;
        DevInfo devInfo;

        Json::CharReaderBuilder rbuilder;
        rbuilder["collectComments"] = false;
        bool parse_ok = Json::parseFromStream(rbuilder, dev_f, &root_arr, &errs);

        if(!parse_ok)
        {
            cout << "Parse json file error !" << endl;
        }
        else
        {
            const Json::Value arrayObj = root_arr;
            cout << " ------ Printf Device information: ------ " << endl;
            try
            {
                for (unsigned int i = 0; i < arrayObj.size(); i++)
                {
                    if(arrayObj[i]["Type"].asString() == "LORA")
                    {
                        devInfo =
                                {
                                 arrayObj[i]["IMEi"].asString(),
                                 arrayObj[i]["Type"].asString(),
                                 arrayObj[i]["Token"].asString()
                                };
                        imeiTable.push_back(devInfo);
                    }
                }
            }
            catch (const Json::LogicError &ex)
            {
                cout << " Parse json string error!" << endl;
            }
        }

        dev_f.close();

        return 0;
    }

};



#endif // DAO_H

?devDB.json:

[
	{
		"IMEi" : "6789999",
		"Token" : "jfkl",
		"Type" : "LORA"
	},
	{
		"IMEi" : "00124b00",
		"Token" : "0",
		"Type" : "xxx"
	},

]

json的解析使用jsoncpp庫,可自行安裝。?文章來源地址http://www.zghlxwxcb.cn/news/detail-861003.html

到了這里,關(guān)于C++下跨平臺(tái)websocket庫及使用示例的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • C#使用xamarin進(jìn)行跨平臺(tái)開發(fā)

    使用 Xamarin 進(jìn)行跨平臺(tái)開發(fā)可以使用 C# 和 .NET 平臺(tái)來開發(fā)移動(dòng)應(yīng)用程序,同時(shí)將代碼在多個(gè)主要移動(dòng)操作系統(tǒng)上運(yùn)行,包括 Android 和 iOS。以下是在 C# 中使用 Xamarin 進(jìn)行跨平臺(tái)開發(fā)的一般步驟: 安裝 Xamarin : 在開始之前,你需要安裝 Xamarin 開發(fā)環(huán)境。你可以選擇安裝 Visual

    2024年02月11日
    瀏覽(96)
  • 【C++】開源:跨平臺(tái)Excel處理庫-libxlsxwriter配置使用

    【C++】開源:跨平臺(tái)Excel處理庫-libxlsxwriter配置使用

    ?? ★,° :.☆( ̄▽ ̄)/$: .°★ ?? 這篇文章主要介紹Excel處理庫-libxlsxwriter配置使用。 無專精則不能成,無涉獵則不能通?!簡⒊?歡迎來到我的博客,一起學(xué)習(xí),共同進(jìn)步。 喜歡的朋友可以關(guān)注一下,下次更新不迷路?? 項(xiàng)目Github地址: https://github.com/jmcnamara/libxlsxwriter

    2024年02月12日
    瀏覽(22)
  • C#使用.Net Core進(jìn)行跨平臺(tái)開發(fā)

    使用 .NET Core 進(jìn)行跨平臺(tái)開發(fā)是一種靈活的方法,可以在多個(gè)操作系統(tǒng)上運(yùn)行 C# 應(yīng)用程序。以下是在 C# 中使用 .NET Core 進(jìn)行跨平臺(tái)開發(fā)的一般步驟: 安裝 .NET Core SDK : 在開始之前,需要安裝適用于操作系統(tǒng)的 .NET Core SDK??梢詮墓俜骄W(wǎng)站(https://dotnet.microsoft.com/download)下載

    2024年02月11日
    瀏覽(93)
  • C++輕量級(jí)跨平臺(tái)桌面GUI庫FLTK的簡單使用

    C++輕量級(jí)跨平臺(tái)桌面GUI庫FLTK的簡單使用

    C++的跨平臺(tái)桌面GUI庫有很多,大體上分成兩種流派:retained mode和immediate mode。 其中前者是主流的桌面GUI機(jī)制框架,包括:Qt、wxwidgets、gtk、juce等 后者是一些游戲引擎編輯器常用的GUI機(jī)制框架,包括:imgui、nanogui等 使用這些框架都支持構(gòu)建在windows、mac、linux上面能運(yùn)行的桌面

    2024年02月08日
    瀏覽(87)
  • 在CPF里使用OpenGL做跨平臺(tái)桌面應(yīng)用開發(fā)

    在CPF里使用OpenGL做跨平臺(tái)桌面應(yīng)用開發(fā)

    CPF 是開源的C#跨平臺(tái)UI框架,支持使用OpenGL來渲染,可以用來硬件加速播放視頻或者顯示3D模型 實(shí)現(xiàn)原理其實(shí)就是Skia用OpenGL后端,Skia里綁定GLView的OpenGL紋理,將紋理作為Skia的圖像混合繪制。 在CPF里使用OpenGL,不能選擇NetCore3.0和Net4,需要選擇Netcore3.1以及之后的版本。 Nuget里

    2024年02月05日
    瀏覽(32)
  • 【HarmonyOS開發(fā)】ArkUI-X 跨平臺(tái)框架(使用ArkTs開發(fā)Android&IOS)

    【HarmonyOS開發(fā)】ArkUI-X 跨平臺(tái)框架(使用ArkTs開發(fā)Android&IOS)

    ArkUI-X 跨平臺(tái)框架進(jìn)一步將 ArkUI 開發(fā)框架擴(kuò)展到了多個(gè)OS平臺(tái),目前支持OpenHarmony、HarmonyOS、Android、 iOS,后續(xù)會(huì)逐步增加更多平臺(tái)支持。開發(fā)者基于一套主代碼,就可以構(gòu)建支持多平臺(tái)的精美、高性能應(yīng)用。 React Native 是一個(gè)基于 JavaScript 和 React 的開源框架,由 Facebook 開發(fā)和

    2024年01月20日
    瀏覽(27)
  • 使用electron-vite +Vue+ElementPlus開發(fā)跨平臺(tái)桌面應(yīng)用

    使用electron-vite +Vue+ElementPlus開發(fā)跨平臺(tái)桌面應(yīng)用

    我們的項(xiàng)目是基于Elasticsearch來進(jìn)行數(shù)據(jù)的存儲(chǔ)與查詢的,使用過ES的朋友應(yīng)該都比較清楚,現(xiàn)在還沒有一個(gè)比較友好的ES的桌面客戶端軟件可以和MySQL的桌面客戶端軟件媲美的,使用ES起來非常麻煩,經(jīng)常會(huì)被吐槽的三個(gè)點(diǎn): 資深測試吐槽:為什么技術(shù)選型要選擇ES,增刪改查

    2023年04月09日
    瀏覽(97)
  • Python使用pywebview開發(fā)桌面應(yīng)用:打造現(xiàn)代化、跨平臺(tái)的用戶體驗(yàn)

    Python使用pywebview開發(fā)桌面應(yīng)用:打造現(xiàn)代化、跨平臺(tái)的用戶體驗(yàn)

    ?? 個(gè)人網(wǎng)站:ipengtao.com 在當(dāng)今科技快速發(fā)展的時(shí)代,為了提供更好的用戶體驗(yàn),許多應(yīng)用程序都轉(zhuǎn)向了桌面應(yīng)用的開發(fā)。在Python領(lǐng)域, pywebview 是一款優(yōu)秀的庫,它使得用Web技術(shù)開發(fā)桌面應(yīng)用變得輕而易舉。本文將深入探討如何使用 pywebview 創(chuàng)建現(xiàn)代化、跨平臺(tái)的桌面應(yīng)用,

    2024年02月04日
    瀏覽(40)
  • 跨平臺(tái)開發(fā)神器如何在Uniapp中使用WebView實(shí)現(xiàn)與Web頁面的通訊!

    Uniapp 是一個(gè)跨平臺(tái)的開發(fā)框架,可以同時(shí)開發(fā)出 iOS、Android、H5 等多個(gè)平臺(tái)的應(yīng)用。在開發(fā)過程中,我們可能需要與 Web 頁面進(jìn)行通訊,這時(shí)可以使用 WebView 組件來實(shí)現(xiàn)。 本教程將介紹如何在 uniapp 中使用 WebView 組件與 Web 頁面進(jìn)行通訊。 首先,我們需要?jiǎng)?chuàng)建一個(gè) uniapp 項(xiàng)目。

    2024年02月09日
    瀏覽(34)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包