经过一个多月努力,框架终于加上了WebSocket client,面对物联网还加上了Socket server 和Socket client,也加上了RPC server and client,优化了httpclient,优化了很多小细节。
下面是websocket server例子,支持协程和同步方式。
class loopwebsockets : public websockets_api
{
public:
loopwebsockets(unsigned int m, unsigned int g) : websockets_api(8, m, g, 0) {}
~loopwebsockets() { std::cout << "~loopwebsockets" << std::endl; }
public:
void onopen() override
{
isco=true;
loop_num = 8;
std::cout << "onopen" << std::endl;
}
void onclose() override
{
isclose = true;
std::cout << "onclose" << std::endl;
}
void onpong() override {}
void run_loop() override
{
if (session_sock)
{
std::cout << "timeloop:" << std::endl;
std::string aa = "test run_loop";
std::string outhello;
ws_parse->makeWSText(aa, outhello);
session_sock->send_data(outhello);
// peer->send(aa);
if (loop_num == 4)
{
loop_num = 0;
return;
}
loop_num--;
}
else
{
isclose = true;
loop_num = 0;
std::cout << "session_sock is die!" << std::endl;
}
}
asio::awaitable<void> async_run_loop() override
{
if (session_sock)
{
std::cout << "async timeloop:" << std::endl;
std::string aa = "test async_run_loop";
std::string outhello;
ws_parse->makeWSText(aa, outhello);
session_sock->send_data(outhello);
// peer->send(aa);
if (loop_num == 4)
{
loop_num = 0;
co_return;
}
loop_num--;
}
else
{
isclose = true;
loop_num = 0;
std::cout << "session_sock is die!" << std::endl;
}
co_return;
}
void onfiles(std::string_view filename) override { std::cout << "--------onfiles:--------" << filename << std::endl; }
asio::awaitable<void> async_onfiles(std::string_view filename) override
{
std::cout << "--------onfiles:--------" << filename << std::endl;
co_return;
}
asio::awaitable<void> async_onmessage(std::string_view data) override
{
std::string outhello;
ws_parse->makeWSText(data, outhello);
co_await session_sock->co_send_writer(outhello);
co_return;
}
void onmessage(std::string_view data) override
{
if (session_sock)
{
std::string outhello;
ws_parse->makeWSText(data, outhello);
session_sock->send_data(outhello);
}
}
};
websocket client端例子
//@urlpath(null,test_websocket_client)
asio::awaitable<std::string> test_websocket_client(std::shared_ptr<httppeer> peer)
{
httppeer &client = peer->get_peer();
client << " hello world! this is a test test_socket_client function. ";
std::shared_ptr<http::websocket_client> a = std::make_shared<http::websocket_client>();
std::string send_content;
bool isok = co_await a->async_connect("ws://127.0.0.1:80/wstest");
// a->set_url("127.0.0.1/wstest");
// a->set_port(80);
//bool isok = co_await a->async_connect();
if(!isok)
{
client << " <hr> async_connect error.";
co_return "";
}
isok =co_await a->websocket_handshake();
if(!isok)
{
client << a->error_msg;
client << " <hr> websocket_handshake error.";
co_return "";
}
send_content="websocket client";
std::string outdata;
a->make_ws_text(send_content,outdata);
unsigned int n = co_await a->async_write(outdata);
client << " <hr >send:"<<n;
//end echo http client
//Let the websocket client run alone in the background
a->async_dur_time_loop_fun = [](std::shared_ptr<websocket_client> b)-> asio::awaitable<void> {
std::string send_content="websocket client loop";
std::string outdata;
b->make_ws_text(send_content,outdata);
unsigned int n = co_await b->async_write(outdata);
if(n == outdata.size())
{
}
co_return;
};
//read loop
a->async_recv_finish_fun = [](std::shared_ptr<websocket_client> b)-> asio::awaitable<void> {
if(b->recv_data.length > 0)
{
}
co_return;
};
a->async_run_loop_fun = [](std::shared_ptr<websocket_client> b, unsigned int n)-> asio::awaitable<void> {
b->process_data(b->data, n);
if(b->recv_data.isfinish)
{
if(b->async_recv_finish_fun != nullptr)
{
co_await b->async_recv_finish_fun(b);
}
b->reset_recv_status();
}
co_return;
};
co_spawn(a->strand_, [a]() mutable
{ return a->async_run_loop(); },
asio::detached);
//if not set time out, must add to client task loop
a->add_client_task_loop();
co_return "";
}
1.特性*****
✅ 1. 自带json编解码不用第三方库,标准json支持
✅ 2. 支持多域名网站
✅ 3. 支持多域名ssl 服务端
✅ 4. 支持http/1.1、http/2协议
✅ 5. 支持WebSocket服务端和客户端,双工收发
✅ 6. 框架自带WebSocket推送,支持定时推送到WebSocket客户端
✅ 7. 支持httpclient get post,同步异步、协程模式,数据采集
✅ 8. 框架自带ORM,使用链接池方式,目前支持MySQL,支持协程和同步模式
✅ 9. 框架自带线程池,和用户代码运行的线程池
✅10. 框架使用asio自带的协程
✅11. 框架特色是I/O 使用协程池 用户代码运行使用线程池,类似GO那种调度,只是针对http请求调度
✅12. 框架支持普通文件gzip、br,并支持缓存到磁盘,下次不用cpu再压缩
✅13. URL、POST和上传文件,解析结果client.get[] client.post[] client.files[]方式获取内容
✅14. 自带sendmail类库
✅15. 生成二维码(qrcode),需要gd、qrencode库
✅16. 插件化编程,热动态更新,使用动态库方式
✅17. 框架内置通用数据缓存模块,ORM结果缓存,提高并发能力
✅18. 框架controller目录注解功能,方便添加URL路由映射,降低入门心智
✅19. 结构和类注解JSON功能,使用json_encode json_decode操作复杂C++结构体和JSON互转,可以参考Wiki
✅20. 提供一个完整admin后台管理框架(见后面图片), 访问URL为 /admin/main
✅21. 支持PHP-FPM fastcgi运行模式,代替Apache做PHP前端,让PHP程序员平稳过渡到 C++ 开发模式
✅22. 内置微信小程序支付功能
✅23. 支持Socket服务端和客户端,支持Socket ssl连接
✅24. 支持RPC服务端和客户端,使用http注册的URL函数
https://github.com/hggq/paozhu