使用Websocket实现消息推送(下)

Charles的安装和使用教程(包含使用Charles进行抓包) Charles 是 PC 端常用的网络封包截取工具, 也可以抓取移动端的网络请求。除了调试接口外,Charles 也可以用于分析第三方应用的请求。配合 Charles 的 SSL 功能,Charles 还可以分析 Https 协议 阅读详情

0x00 WebSocket

上一篇使用 Java-WebSocket 写了一套 WebSocket 的Demo,这一篇着重分析下WebSocket 的一些实现细节,更加详细的协议细节可参考 RFC6455。

0x01 WebSocket协议

  • WebSocket 协议: 可参考RFC6455
  • 抓包工具:Charles 和 WireShark
  • 测试代码:参考上一篇Demo

0x02 数据传输

  • 连接和断开

    当 Client 向 Server 发起 ws 连接请求后,会先使用 HTTP 协议建立 TCP 长链接,通过抓包,我们会看到类似这样的信息:

    Request:

    Charles Request

    Response:

    Charles Response

    这里简单介绍几个关键的Header字段:

    • upgrade:websocket
    • connection:Upgrade
    • sec-websocket-version:13
    • sec-websocket-key:xxxxxx
    • sec-websocket-accept:

    这些字段的信息可参考这里。

  • 数据传输

    当 HTTP 连接建立之后,就可以通过这个长链接进行数据传输了。如果你使用 Charles 进行数据抓包的话,可以看到类似下图中这样的聊天内容:

    Charles websocket Chat

    在同一个 HTTP 请求中,我们看到不断有数据交互,而不是像之前的 HTTP 请求那样,每发送一条数据,都需要发起一次新的请求。

    下面我们来尝试分析一下。这里要用到Wireshark。可能你会为什么换了Wireshark而不用Charles了?原因很简单,Charles给我们呈现的是应用层最终的结果,而传输层的具体的数据包发送接收却不能展示,这个时候就需要借助Wireshark来对TCP数据包进行分析了。

    首先,查询 RFC6455文档,我们得知 ws 协议的数据包格式如下:

    RFC6455 Frame

    有了这个参考,我们就可以进行数据分析了。下面是我的一次数据收发过程:客户端向服务端发送数据:123456789,然后服务端原样发回,抓包如下:

    Sender:

    WireShark sender

    Receiver:

    WireShark receiver

    下面我们着重对这两个数据包进行分析。细心的你可能会发现,截图中有四条数据,如果你对TCP的传输有所了解,第二条和第三条是确认报文。

    我们先看下接收到数据。点击数据中的 Data(11bytes) 部分,下方是自动选择了数据部分:8109313233343536373839。(在此之前是TCP报文的Header部分,我们可以忽略)根据 ws 协议,我们将其展开:

    81 09:  10000001 00001001 
    31 32:  00110001 00110010
    33 34:  00110011 00110100
    35 36:  00110101 00110110
    37 38:  00110111 00111000
    39   :  00111001

    0:1,这是最后一帧
    1~3:全为0
    4~7:001,附加数据帧
    8:0,PlayloadData未经过掩码
    9~15:0001001 = 9 < 125,因此数据长度位9
    剩下的:313233343536373839即为数据 123456789

    再来看看发送的数据。点击 Data(15bytes) 部分,下方的数据部分:818911eb9db220d9ae8624ddaa8a28,展开:

    81 89 : 10000001 10001001 
    11 eb : 00010001 11101011
    9d b2 : 10011101 10110010
    20 d9 : 00100000 11011001
    ae 86 : 10101110 10000110
    24 dd : 00100100 11011101
    aa 8a : 10101010 10001010
    28    : 00101000

    0:1,这是最后一帧
    1~3:全为0
    4~7:001,附加数据帧
    8:1,PlayloadData经过掩码,(所有的由客户端发往服务端的帧此数位都被设置成 1。)
    9~15:0001001 = 9 < 125,因此数据长度位9
    11 eb 9d b2:掩码
    20 d9 ae 86 24 dd aa 8a 28:数据
    关于掩码的计算:
    掩码的计算

  • 连接保持

    除了正常的数据传输之外,Socket编程还有一个重要的组成部分:心跳保持。ws协议中定义了专门的数据包:

    Control frames are identified by opcodes where the most significant bit of the opcode is 1. Currently defined opcodes for control frames include 0x8 (Close), 0x9 (Ping), and 0xA (Pong). Opcodes 0xB-0xF are reserved for further control frames yet to be defined.
    Control frames are used to communicate state about the WebSocket. Control frames can be interjected in the middle of a fragmented message.
    All control frames MUST have a payload length of 125 bytes or less and MUST NOT be fragmented.

  • 其他

    一个协议不可能就这么简单,如果你还想了解更多,可参考RFC6455。


参考:

  1. http://www.jianshu.com/p/867274a5e054
  2. http://www.jianshu.com/p/fc09b0899141
  3. https://datatracker.ietf.org/doc/rfc6455/
  4. https://developer.mozilla.org/zh-CN/docs/WebSockets/Writing_WebSocket_servers

Spring Boot 使用 WebSocket 实现消息推送 及 WebSocket原理 WebSocket 是什么原理,为什么可以实现持久连接? 一、WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接的不算) 首先HTTP有1.1和1.0之说,也就是所谓的keep-alive,把多个HTTP请求合并为一个,但是Websocket其实是一个新协议,跟HTTP协议基本没有关系,只是为了兼容 阅读详情

相关推荐

Django使用websocket实现实时消息推送和聊天

websocket简介 WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。 WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。 在 WebSocket API 中,浏览器和服务...

菲宇运维 2561

charles学习笔记

charles学习笔记 作用 是一个代理,代理进行域名解析,数据从客户端到服务器进行转发。 进入compose 右键目标数据包——选择compose,可以对数据包的内容进行修改 maplocal将请求映射到本地文件 mapremote映射远程-要配置ip - http【代理在应用层】/https是无状态的, websocket是持久连接的,有状态的-长连接 wireshark过滤ip和端口 ...

weixin_45459322的博客 864

使用WebSocket实现Android消息推送

在上述代码中,我们继承了WebSocketClient类,并重写了其中的几个方法。在onMessage方法中,可以处理收到的服务器推送消息;在onError方法中,可以处理连接过程中发生的错误。在Android应用中使用WebSocket可以实现消息推送功能,使得应用能够接收实时的推送消息,提升用户体验。在上述代码中,我们创建了一个WebSocketClient对象,并传入服务器的URL。最后,当我们不再需要连接时,可以调用WebSocketClient对象的close()方法来断开连接并释放资源。

HackMasterX的博客 538

charles配置抓取websocket包

proxy->proxy Settings 勾选enable socket proxy 配置完之后,记得修改代理,如果要抓取socket包,需要代理端口为8889. 问题:这样做的一个问题是,抓取http包时,就抓不了socket包,因为两个端口不一样。 结果: 最后看到的是get post。不过这其实已经是websocket的包了。 ...

ximi_xuexi的专栏 2万+

使用 WebSocket 实现实时消息推送

虽然 WebSocket 已经是个“老将”了,但它在实时通信领域的地位依然不可撼动。通过上面的示例,我们可以看到使用 Java 和 Spring Boot 实现 WebSocket 消息推送是多么简单和高效。

wjianwei666的专栏 888

SolidWorks + AI:利用 DeepSeek AI 自动生成 VBA Macro 宏,实现智能化建模!

本教程介绍如何将集成到插件,实现的自动化操作。通过 DeepSeek AI,您可以快速生成高效的,提升!💡。

SolidWorksAPI的专栏 1万+

Charles抓包长链接(WebSoceket)

charles抓包websocket

Menu_cai的博客 7849

手把手教你用smarteye搭建免费GB28181监控平台(含海康设备接入避坑指南)

本文提供了一份基于SmartEye搭建免费GB28181视频监控平台的实战指南。详细介绍了从服务器部署、GB28181协议核心配置,到海康威视等主流设备接入的完整流程,并重点分享了设备注册失败、无法预览等常见问题的深度排错方法,旨在帮助中小企业及开发者低成本实现多品牌监控设备的统一管理。

pz89012345的博客 327

Charles抓包教程

0 概述 文档内容:主要描述使用Charles工具抓取移动端APP与服务器传输数据的操作教程。 文档用图:支持开发者学习Charles抓包,辅助SDK接入问题排查和反馈。 1 关键定义 Charles:PC端网络封包截取工具,可用于截取移动端应用程序与服务器端网络通讯协议内容。 抓包:packet capture,将网络传输发送与接收的数据包进行截获、重发、编辑、转存等操作。 2 安装Charles 2.1 下载Charles安装包 下载地址:http://www.charlesproxy.com 2.2

weixin_43945590的博客 4442

变压器励磁电感、励磁电流、漏感、漏感折算

励磁、漏感知识整理

HW-BASE的博客 1万+

微调大模型如何准备数据集——常用数据集,Alpaca和ShareGPT

在大模型微调中,我们一般使用Alpaca 和 ShareGPT和两种格式的数据集。

Science prince的博客 1097

Django使用Channels实现WebSocket消息推送功能

django的channels配置,解决channels不生效问题,后端实时消息推送

weixin_43901010的博客 2909

YOLOv11 模型改进:利用新型损失函数实现精度跃升(含代码全解析)

在目标检测领域,损失函数的选择直接决定模型的精度上限。某自动驾驶公司将 YOLOv11 原有损失替换为新型损失后,障碍物检测 mAP 提升 10%,夜间场景误检率降低 22%;某物流分拣项目中,采用新损失的 YOLOv11 模型对小包裹的识别准确率从 82% 升至 96%。如果你也在为模型精度瓶颈、样本不平衡问题困扰,这篇教程将带你掌握 YOLOv11 损失函数的进阶技巧,真正帮你在检测性能上实现突破。损失函数是模型训练的“指南针”,它定义了模型“学习的方向”。传统损失(如 BCE、Focal Loss)在

m0_71589036的博客 715

Spring Boot使用WebSocket实现后台消息推送

Spring Boot使用WebSocket实现后台消息推送 为什么需要WebSocket? 已经有了HTTP协议,为什么还需要另一个协议?这是因为HTTP协议有一个缺陷:通信只能由客户端发起。 当客户端想知道某个订单是否已经完成支付,使用HTTP协议只能由客户端向服务器发出请求,服务器返回查询结果,可以知道HTTP协议做不到服务器主动向客户端推送信息。 这种单向请求的特点,注定了如果服务器有连续的状态变化,客户端要获知就非常麻烦。我们只能使用"轮询":每隔一段时候,就发出一个询问,了解服务器有没有新的信息

kaven 2279

LVGL 磁罗盘效果

环境:LVGL 9.x + SDL2,窗口 1280×800。界面文案用英文(默认 Montserrat,无 CJK)。本文按实现顺序讲:先建立两个耦合转动体,再把磁倾角误差从卡面倾斜里推出来,最后用同一套投影把刻度、数字和目标画到卡上。画面上的迟滞、涡流、摆动和读数偏差都来自方程,没有补间动画。

摸鱼专家 120

爬虫实战:拆解WASM加密参数,破局2026电商动态接口反爬(实测某头部电商可用)

sign和wasm_token,而且每次请求这两个参数都在动态变化。用常规的参数拼接、MD5加密尝试还原,结果全是403;反编译前端JS,发现核心加密逻辑被打包成了.wasm,把关键参数加密、签名逻辑藏在二进制模块里,让爬虫无法直接逆向JS拿到加密规则。前后折腾了5天,从WASM文件解析、JS与WASM交互逻辑拆解,到本地还原加密参数、实战验证,踩了无数坑(比如WASM版本不兼容、内存数据读取失败、加密依赖环境缺失),最终成功还原了加密流程,稳定爬取商品详情、价格、销量等核心数据,连续运行72小时无封禁。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1914

使用golang实现websocket消息推送

golang 推送 webSocket ws rabbitmq gin docker

a34ErxV的博客 3111

YOLOv9改进,YOLOv9添加CBAM注意力机制

CBAM是一个简单而有效的注意力模块,用于前馈卷积神经网络。给定一个中间特征图,我们的模块按顺序推断两个独立维度(通道和空间)的注意力图,然后将注意力图乘以输入特征图以进行自适应特征细化。由于 CBAM 是一个轻量级的通用模块,因此它可以无缝集成到任何 CNN 架构中,开销可以忽略不计,并且可以与基础 CNN 一起进行端到端训练。论文链接:(CBAM论文)

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 859

在Spring Boot框架下使用WebSocket实现消息推送

Spring Boot的学习持续进行中。前面两篇博客我们介绍了如何使用Spring Boot容器搭建Web项目(使用Spring Boot开发Web项目)以及怎样为我们的Project添加HTTPS的支持(使用Spring Boot开发Web项目(二)之添加HTTPS支持),在这两篇文章的基础上,我们今天来看看如何在Spring Boot中使用WebSocket。 什么是WebSocket

江南一点雨的专栏 11万+

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

使用php实现websocket实时消息推送的方法整理

php实现websocket实时消息推送建立websocket服务端建立client客户端 建立websocket服务端 liaotianServer.php <?php /** * Created by qipa250 * Date: 2019/08/05 * Time: 14:33 */ class SocketService { private $address = '...

徊忆羽菲 2676

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

使用WebSocket并在Java和Vue中实现后台消息推送

这两个方法可以在Vue组件的模板中绑定到按钮或其他事件上,以实现相应的功能。在上面的例子中,我们使用Java EE WebSocket API创建了一个WebSocket服务器。以上是大致的实现步骤,具体的代码实现以及使用的库可能会有所不同,具体根据项目需求和开发环境进行调整。在上述代码中,首先在Vue组件中导入WebSocket库和其他需要使用的库。回调方法中,我们打印出WebSocket错误的详细信息。回调方法中,我们打印出WebSocket关闭的原因。回调方法中,我们打印出接收到的消息,并使用。

qq_31532979的贺公子之数据科学与艺术博客,致力于科技向善,拥抱开源,要用技术的影响力来领导团队,而不是威权和职位! 1514

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

php websocket消息推送,怎么在php中使用websocket实现实时消息推送功能

怎么在php中使用websocket实现实时消息推送功能发布时间:2021-02-15 10:43:40来源:亿速云阅读:62作者:Leah怎么在php中使用websocket实现实时消息推送功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。SocketService.php...

weixin_42299560的博客 419

使用spring boot+WebSocket 实现定时消息推送(基于注解)

作者:清风徐来水波不清https://www.jianshu.com/p/62132f605669前言前面文章也有 websocket 相关的文章,为什...

java思维导图 3480

【SpringBoot学习】43、SpringBoot 使用 Uniapp 集成 Websocket 实现消息推送

文章目录SpringBoot 使用 Uniapp 集成 Websocket 实现消息推送1、SpringBoot 配置(1)依赖配置(2)Websocket 配置(3)测试控制层(4)服务端业务主动发送消息2、Uniapp 配置微信公众号 SpringBoot 使用 Uniapp 集成 Websocket 实现消息推送 1、SpringBoot 配置 (1)依赖配置 导入依赖,一样的 stater,这里就不多概述了 <dependency> <gro

Tellsea 3964

使用spring boot +WebSocket实现(后台主动)消息推送

前言:使用此webscoket务必确保生产环境能兼容/支持!使用此webscoket务必确保生产环境能兼容/支持!使用此webscoket务必确保生产环境能兼容/支持!主要是tomcat的兼容与支持。有个需求:APP用户产生某个操作,需要让后台管理系统部分人员感知(表现为一个页面消息)。最早版本是后台管理系统轮训,每隔一段时间轮训一次,由于消息重要,每隔几秒就查一次。这样做明显很不雅!会消耗大量资...

zhangdehua678的博客 14万+
上一篇: Mac下Homebrew 安装 Mysql
下一篇: Retrofit初探——POST方式提交JSON数据
ttdevs
博客等级 码龄15年 388粉丝 91原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值