使用过标准的libwebsockets服务端库测试过,主要是短小精悍,相对于libwebsockets不需要依赖zlib和openssl 以及其他库,直接make就可以使用了,linux跟windows都可以使用。
测试用例:
#include "easywsclient.hpp"
#include
#include
#include
using easywsclient::WebSocket;
static WebSocket::pointer ws = NULL;
void handle_message(const std::string & message)
{
printf(">>> %s\n", message.c_str());
if (message == "world") { ws->close(); }
}
int main()
{
ws = WebSocket::from_url("ws://localhost:8126/foo");
assert(ws);//判断ws对象是否为空null
ws->send("goodbye");
ws->send("hello");
//如果你需要多线程,可以在一个thread 维护该ws的连接重连机制
while (ws->getReadyState() != WebSocket::CLOSED) //判断ws是否正常连接
{
ws->poll();//这个必须要调用,否则不能发送,发送跟接收都是异步的,都是在这个poll函数里监测处理的
ws->dispatch(handle_message);
}
delete ws;
return 0;
}
//线程thread 维护重连连接
void run()
{
bool conn = FLASE;
ws = WebSocket::from_url("ws://localhost:8126/foo");
//如果你需要多线程,可以在一个thread 维护该ws的连接重连机制
while (1) //判断ws是否正常连接
{
if(ws != NULL)
{
ws->poll(0);//这个必须要调用,否则不能发送,发送跟接收都是异步的,都是在这个poll函数里监测处 理的
ws->dispatch(handle_message);
if(ws->getReadyState() == WebSocket::CLOSED)
{
//ws连接断开 重连
delete ws;
ws = NULL;
ws = WebSocket::from_url("ws://localhost:8126/foo");
}
else if(wss->getReadyState()== WebSocket::OPEN)
{
//ws连接ok
// ws->send("goodbye");
ws->send("hello");
}
}
else
{
ws = WebSocket::from_url("ws://localhost:8126/foo");
sleep(1);
}
usleep(100);
}
if(ws!=NULL)
delete ws;
}
有细心的朋友发现在发送中文GBK 的时候与服务端会断开
//GBK -> UTF-8
//遇到发送的字符串里有中文的话需要send 前进行转换一下,
//这个是网友提供的在windows下的转换函数
std::string Server_Stream::GBKToUTF8(const std::string& strGBK)
{
std::string strOutUTF8 = "";
WCHAR * str1;
int n = MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, NULL, 0);
str1 = new WCHAR[n];
MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, str1, n);
n = WideCharToMultiByte(CP_UTF8, 0, str1, -1, NULL, 0, NULL, NULL);
char * str2 = new char[n];
WideCharToMultiByte(CP_UTF8, 0, str1, -1, str2, n, NULL, NULL);
strOutUTF8 = str2;
delete[]str1;
str1 = NULL;
delete[]str2;
str2 = NULL;
return strOutUTF8;
}
下面是C++实现的WebSocket客户端,写好后这里记一下,免得以后忘记。
本示例共有三个文件组成,依赖Websocket++第三方库
其中main.cpp是使用示例
#include
#include
#include
#include "websocket_endpoint.h"
int main(int argc, char **argv)
{
bool done = false;
std::string input;
kagula::websocket_endpoint endpoint;
endpoint.connect("ws://localhost:9002");
while (!done) {
std::cout << "Enter Command: ";
std::getline(std::cin, input);
if (input == "quit") {
done = true;
}
else if (input.substr(0, 4) == "send") {
std::stringstream ss(input);
std::string cmd;
std::string message;
ss >> cmd;
std::getline(ss, message);
endpoint.send(message);
}
else if (input.substr(0, 4) == "show") {
endpoint.show();
}
else {
std::cout << "> Unrecognized Command" << std::endl;
}
}
endpoint.close();
return 0;
}
其它两个文件是封装
websocket_endpoint.h文件清单
#ifndef _WEBSOCKET_ENDPOINT_
#define _WEBSOCKET_ENDPOINT_
#include
/*
Title: Web Socket Client
Author: kagula
Date: 2016-11-21
Dependencies: Websocket++、Boost::ASIO
Test Environment: VS2013 Update5, WebSocket++ 0.70, Boost 1.61
Description:
[1]Support connect a web socket server.
[2]If server is crash, client will not follow crash.
*/
namespace kagula
{
class websocket_endpoint {
public:
websocket_endpoint();
~websocket_endpoint();
int connect(std::string const & uri);
void close();
void send(std::string message);
void show();
};
}
#endif
websocket_endpoint.cpp文件清单
#include
#include
#include
#include
#include
#include
#include
到此这篇关于C++编写的WebSocket客户端实现示例代码的文章就介绍到这了,更多相关C++ WebSocket客户端内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!