C++下跨平台websocket库及使用示例

这篇具有很好参考价值的文章主要介绍了C++下跨平台websocket库及使用示例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

websocketpp库使用非常方便,开源,可跨平台,内部实现全部是head文件,无cpp,接口简单易用。源码路径比如 https://github.com/zaphoyd/websocketpp.git

使用方法是,先下载源码包并复制道工程的include目录下。

--include

   --websocketpp

然后在代码#include "utility_client.hpp"即可调用其接口进行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);
}

/***********************************************************
* 描述: 处理数据
* 入参: wholeMsg - 要处理的数据
* 出参: 无
* 返回: 无
************************************************************/
void WebsocketTalker::handleData(const string& wholeMsg)
{

	cout <<endl;

}



/***********************************************************
* 描述: websocket通信线程
* 入参: 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;
                /*循环接收消息 */
                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库,可自行安装。 文章来源地址https://www.toymoban.com/news/detail-861003.html

到了这里,关于C++下跨平台websocket库及使用示例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C#使用xamarin进行跨平台开发

    使用 Xamarin 进行跨平台开发可以使用 C# 和 .NET 平台来开发移动应用程序,同时将代码在多个主要移动操作系统上运行,包括 Android 和 iOS。以下是在 C# 中使用 Xamarin 进行跨平台开发的一般步骤: 安装 Xamarin : 在开始之前,你需要安装 Xamarin 开发环境。你可以选择安装 Visual

    2024年02月11日
    浏览(35)
  • 【C++】开源:跨平台Excel处理库-libxlsxwriter配置使用

    😏 ★,° :.☆( ̄▽ ̄)/$: .°★ 😏 这篇文章主要介绍Excel处理库-libxlsxwriter配置使用。 无专精则不能成,无涉猎则不能通。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下次更新不迷路🥞 项目Github地址: https://github.com/jmcnamara/libxlsxwriter

    2024年02月12日
    浏览(33)
  • C#使用.Net Core进行跨平台开发

    使用 .NET Core 进行跨平台开发是一种灵活的方法,可以在多个操作系统上运行 C# 应用程序。以下是在 C# 中使用 .NET Core 进行跨平台开发的一般步骤: 安装 .NET Core SDK : 在开始之前,需要安装适用于操作系统的 .NET Core SDK。可以从官方网站(https://dotnet.microsoft.com/download)下载

    2024年02月11日
    浏览(34)
  • C++轻量级跨平台桌面GUI库FLTK的简单使用

    C++的跨平台桌面GUI库有很多,大体上分成两种流派:retained mode和immediate mode。 其中前者是主流的桌面GUI机制框架,包括:Qt、wxwidgets、gtk、juce等 后者是一些游戏引擎编辑器常用的GUI机制框架,包括:imgui、nanogui等 使用这些框架都支持构建在windows、mac、linux上面能运行的桌面

    2024年02月08日
    浏览(29)
  • 在CPF里使用OpenGL做跨平台桌面应用开发

    CPF 是开源的C#跨平台UI框架,支持使用OpenGL来渲染,可以用来硬件加速播放视频或者显示3D模型 实现原理其实就是Skia用OpenGL后端,Skia里绑定GLView的OpenGL纹理,将纹理作为Skia的图像混合绘制。 在CPF里使用OpenGL,不能选择NetCore3.0和Net4,需要选择Netcore3.1以及之后的版本。 Nuget里

    2024年02月05日
    浏览(68)
  • 【HarmonyOS开发】ArkUI-X 跨平台框架(使用ArkTs开发Android&IOS)

    ArkUI-X 跨平台框架进一步将 ArkUI 开发框架扩展到了多个OS平台,目前支持OpenHarmony、HarmonyOS、Android、 iOS,后续会逐步增加更多平台支持。开发者基于一套主代码,就可以构建支持多平台的精美、高性能应用。 React Native 是一个基于 JavaScript 和 React 的开源框架,由 Facebook 开发和

    2024年01月20日
    浏览(34)
  • 使用electron-vite +Vue+ElementPlus开发跨平台桌面应用

    我们的项目是基于Elasticsearch来进行数据的存储与查询的,使用过ES的朋友应该都比较清楚,现在还没有一个比较友好的ES的桌面客户端软件可以和MySQL的桌面客户端软件媲美的,使用ES起来非常麻烦,经常会被吐槽的三个点: 资深测试吐槽:为什么技术选型要选择ES,增删改查

    2023年04月09日
    浏览(60)
  • Python使用pywebview开发桌面应用:打造现代化、跨平台的用户体验

    📚 个人网站:ipengtao.com 在当今科技快速发展的时代,为了提供更好的用户体验,许多应用程序都转向了桌面应用的开发。在Python领域, pywebview 是一款优秀的库,它使得用Web技术开发桌面应用变得轻而易举。本文将深入探讨如何使用 pywebview 创建现代化、跨平台的桌面应用,

    2024年02月04日
    浏览(35)
  • 跨平台开发神器如何在Uniapp中使用WebView实现与Web页面的通讯!

    Uniapp 是一个跨平台的开发框架,可以同时开发出 iOS、Android、H5 等多个平台的应用。在开发过程中,我们可能需要与 Web 页面进行通讯,这时可以使用 WebView 组件来实现。 本教程将介绍如何在 uniapp 中使用 WebView 组件与 Web 页面进行通讯。 首先,我们需要创建一个 uniapp 项目。

    2024年02月09日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包