首页 > 其他分享 >websocket学习

websocket学习

时间:2024-07-27 23:40:11浏览次数:12  
标签:协议 websocket 实时 学习 WS Http 客户端

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即可使用;(附加依赖目录)

  

标签:协议,websocket,实时,学习,WS,Http,客户端
From: https://www.cnblogs.com/8335IT/p/18327478

相关文章

  • Python学习笔记46:游戏篇之外星人入侵(七)
    前言到目前为止,我们已经完成了游戏窗口的创建,飞船的加载,飞船的移动,发射子弹等功能。很高兴的说一声,基础的游戏功能已经完成一半了,再过几天我们就可以尝试驾驶飞船击毁外星人了。当然,计分,游戏次数,背景音乐,开始启动等按钮的功能需要我们慢慢添加,这些功能不影响游戏的使用,影......
  • Python学习笔记45:游戏篇之外星人入侵(六)
    前言飞船模块的功能基本已经完成。今天继续完成子弹模块的功能。子弹模块子弹和飞船模块,在游戏逻辑中有一种生成与被生成的表面关系,因为子弹在游戏中是由飞船发射的。但是在我们实际抽象的过程中,飞船与子弹并不是is的关系,甚至可以说不是has的关系。因此我们需要将两个对......
  • CMake学习(二)
    CMake(二)1、C++标准指定CMake有一些特殊的变量,它们有的是在底层创建的,或者是在项目代码设置时对CMake有意义的,其中许多变量以CMAKE_开头的在我们自己声明配置变量时,需要尽可能避免采用这种命名方式在这些特殊的变量中,包含有2个比较常用的,CMAKE_CXX_STANDARD和CMAKE_CXX_ST......
  • Verilog编程学习之—呼吸灯
    Verilog编程-呼吸灯1.设计目标用FPGA产生占空比变化的PWM波,控制LED灯由暗变亮的变化。2.设计思路设置PWM波的步长为2us,周期为2ms,每个周期内LED亮的时间由0增加至999,再从999减少至0,依次循环,就可以看到LED灯由暗变亮再由亮变暗的循环过程。可以设置一个占空比寄存器duty_r和一个......
  • CMake学习(一)
    CMake学习(一)1、简介CMake是一个强大的软件构建系统,可以用简单的语句来描述所有平台的安装(编译过程)可以编译源代码、制作程序库、产生适配器(wrapper)、还可以用任意的顺序建构执行档https://cmake.org/2、构建基础项目最基础的CMake项目是由单个源代码文件构建的可执行......
  • 《昇思25天学习打卡营第7天|函数式自动微分》
    函数式自动微分神经网络的训练主要使用反向传播算法,模型预测值(logits)与正确标签(label)送入损失函数(lossfunction)获得loss,然后进行反向传播计算,求得梯度(gradients),最终更新至模型参数(parameters)。自动微分能够计算可导函数在某点处的导数值,是反向传播算法的一般化。自动微分......
  • 《昇思25天学习打卡营第5天|数据变换 Transforms》
    数据变换Transforms通常情况下,直接加载的原始数据并不能直接送入神经网络进行训练,此时我们需要对其进行数据预处理。MindSpore提供不同种类的数据变换(Transforms),配合数据处理Pipeline来实现数据预处理。所有的Transforms均可通过map方法传入,实现对指定数据列的处理......
  • 学习c语言第十五天(初阶测评)
    选择题1.下列程序输出结果为672.下列程序输出结果为 死循环打印3.i和j的值分别为什么 214.k的终值是什么905.输出结果是什么 16.正确的是    C7.C语言规定main函数位置    C8.不正确的是    D9.正确的是     c ......
  • [rCore学习笔记 018]实现特权级的切换
    写在前面本随笔是非常菜的菜鸡写的。如有问题请及时提出。可以联系:[email protected]:https://github.com/WindDevil(目前啥也没有本节内容因为risc-v存在硬件特权级机制,我们又要实现一个可以使得应用程序工作在用户级,使得操作系统工作在特权级.原因是要保证用户态的......
  • 每周Java学习汇总
    字符串(String):在Java中,字符串是一个非常重要的数据类型。它是不可变的,意味着一旦创建,就不能更改其内容。字符串可以用双引号(“”)表示。Java提供了许多处理字符串的方法,如拼接、截取、查找、替换等。自增自减运算符(++和--):自增运算符(++)和自减运算符(–)用于对变量进行加1或减1的操......