websocket学习
1、使用场景
1. 实时聊天应用:在线聊天室、即时通讯软件(如微信、QQ等)都广泛使用了WebSocket技术。(多个客户端与服务器进行交互,消息广播,客户端消息监听)
2. 实时数据更新,如股票行情、天气预报、新闻推送等,网页游戏小广告
3. 协同编辑,在协同编辑应用中,多个用户需要同时编辑同一份文档或代码文件,在线文档协作、团队代码编辑等场景都适合使用WebSocket技术。
4. 实时监控,如监控设备的运行状态、实时监测交通流量等。服务器可以实时地将监控数据推送给客户端,客户端可以及时地显示最新的监控信息。
5. 游戏,用于实现多人在线游戏中的实时状态同步和玩家交互。通过WebSocket,多个玩家可以实时地进行游戏对战或合作,提供更好的游戏体验。
6. 直播互动,实现实时评论、弹幕、礼物赠送等互动功能。观众可以实时地发送评论和弹幕,与主播和其他观众进行互动,提高了直播的参与度和趣味性。等等
2、基本交互原理
由于Http是一个半双工通信,只能客户端向服务器发起请求才会回复,(Http 1.0 一问一答,短连接;Http1.1长连接,但是是请求,响应);为了实现一次链接长久通信且无论客户端还是服务器都能主动发起通信,就出现了websocket;
websocket与socket没有任何关系;websocket是一种全双工通信协议;是Http的升级;websocket的连接也是要建立在三次握手之后的一次http链接上,进行http协议升级;
WS(websocket)本身还是借助Http协议,客户端通过在Http协议头增加upgrade字段(connect 类型为upgrade),告知服务器,本http连接不是简单的Http超文本协议交互;而是要升级为WS协议;在交互过程还会携带一个base64编码的字段作为校验;(服务端将客户端发的SWK进行二次加密传回,客户端解密进行本地验证)
3 抓包分析
以这台185机器作为本机,进行本地WS协议播放FLV格式数据实时流
客户端首次发送URL请求的时候,告知服务端要升级成WS协议;服务器如果支持WS协议,就会返回上边理论部分说的信息,并更改协议
接下来就是使用新的传输协议交互的过程,WebSocket协议定义了不同类型的帧,如文本帧和二进制帧,用于传输不同类型的数据。
在一端关闭的时候也会有响应的数据;详见下边案例
WS和Http 都是基于TCP协议的传输协议;所以,不要出现“UDP传输WS的字眼”--当下
WebSocket不支持UDP协议。WebSocket是基于TCP协议的,它在单个TCP连接上提供全双工通信,允许客户端和服务器之间进行实时通信。与传统的HTTP请求-响应模型不同,WebSocket允许服务器主动向客户端推送数据,从而实现更快的实时通信;
HTTP协议不支持UDP。HTTP(HyperText Transfer Protocol)是基于TCP(Transmission Control Protocol)协议的一种应用层协议,用于在客户端和服务器之间传输超文本(如HTML)和各种Web资源
4.案例
先安装boost下载websocket组件
参照博客:https://blog.csdn.net/qq_33177268/article/details/125979802
https://github.com/zaphoyd/websocketpp/
使用在线工具的时候要客户端先建立连接,之后就两边谁主动发都可以了;下边是网页【port:63946】发送“123”给本机的websocket,本机服务端监听端口是9123,收到消息回复***;
交互信息抓包:
结束标记;我这个例子结束时候是在网页先点击断开的;交互抓包如下
#include <websocketpp/config/asio_no_tls.hpp> #include <websocketpp/server.hpp> #include <iostream> typedef websocketpp::server<websocketpp::config::asio> server; using websocketpp::lib::bind; using websocketpp::lib::placeholders::_1; using websocketpp::lib::placeholders::_2; // 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://blog.csdn.net/qq_33177268/article/details/125979802 简单的控制台程序导入websocketpp 和boost即可使用;(附加依赖目录)