一、应用场景

  http 协议 客户端发起请求的时候才会返回内容,如果要处理类似于聊天室的应用,需要客户端不间断的发起请求(轮询),非常占用服务器的性能。所以websocket出现了。

二、ws(wss)协议原理

    1、特点

    服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息
   (1)建立在 TCP 协议之上,服务器端的实现比较容易。
   (2)与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。
   (3)数据格式比较轻量,性能开销小,通信高效。
   (4)可以发送文本,也可以发送二进制数据。
   (5)没有同源限制,客户端可以与任意服务器通信。
   (6)协议标识符是ws(如果加密,则为wss),服务器网址就是 URL。

    2、使用:

    1、浏览器(BOM)实现的不是v8引擎实现的,每次使用都需要自定义
      

    var ws = new WebSocket(url,[protocol]);

    2、webSocket.readyState属性返回实例对象的当前状态,共有四种

    四种状态:
          CONNECTING:值为0,表示正在连接。
          OPEN:值为1,表示连接成功,可以通信了。
          CLOSING:值为2,表示连接正在关闭。
          CLOSED:值为3,表示连接已经关闭,或者打开连接失败。

    js示例

switch (ws.readyState) {
case WebSocket.CONNECTING:
// do something
break;
case WebSocket.OPEN:
// do something
break;
case WebSocket.CLOSING:
// do something
break;
case WebSocket.CLOSED:
// do something
break;
default:
// this never happens
break;
}

  3、http 和ws的关系:

     就是在headers上添加了几个升级的协议包,做了一次协议升级,http常用ajax发包,但是ws不是,它是一个长链接协议,会等待服务器发包。http发的包经常是文本性信息(json/xml/纯文本/自定义/字节码)。但是ws发回来的是字节码(谷歌协议(protobuf(体积比较小常用于游戏协议))QQ的TLV 协议(通用,可以很好处理粘包)  自定义的格式)

    套接字 tcp/udp(会有粘包的问题)

三、websocket的关键词

    1、websocket本身就是一个关键词,因为每次使用都需要自定义

    2、webSocket.readyState 返回实例对象的当前状态
    3、webSocket.onopen 用于指定连接成功后的回调函数 (因为解密我们关心cookie/tooken等)
    4、webSocket.onclose 用于指定连接关闭后的回调函数
    5、webSocket.onmessage 指定收到服务器数据后的回调函数 (因为解密我们关心)
    6、webSocket.send() 用于向服务器发送数据 (因为解密我们关心加密的内容和算法)
    7、webSocket.bufferedAmount 判断发送是否结束
    8、webSocket.onerror 用于指定报错时的回调函数

四、连接包和心跳包

    连接包:webSocket.onopen
      心跳包:如果出现断电等情况,需要让服务器知道我下线,不再等我,客户端每隔一段时间(等30s)发一个没有信息,用于告诉服务器我还在线。否则会被踢出。那么我们爬取的的时候还要注意心跳包的存在。

五、练习:网站(蝌蚪聊天室 http://www.wodexiaoshijie.com/kedou/)

  1、步骤

      抓包
      分析包的信息
      调试
      本地运行


  2、案例(虎牙)
    抓包
      1、搜索下断,搜到很多
      2、搜索socket对象 hook send方法 直接快速
        假设 p 是socket对象
        // TODO hook
        #p.send是被调用的函数名,而p.send_是被调用的功能
        #hook就是在被调用的函数名和被调用的功能之间下一个断点
        #从而实现一旦这个函数被调用,就会被下一个断点
      3、hook

//控制台输入,用于hook
p.send_ = p.send;
//控制台输入,用于hook
p.send = function(x){
debugger;
return p.send_(x);
}

websockets的原理的更多相关文章

  1. .NET WebSockets 核心原理初体验

    上个月我写了<.NET gRPC核心功能初体验>, 里面使用gRPC双向流做了一个打乒乓球的Demo, 实时双向这两个标签是不是很熟悉,对, WebSockets也可以做实时双向通信. 本 ...

  2. 如何仿造websocket请求?

    之前两次singnalr. websocket实时推送相关: .NET WebSockets 核心原理初体验 SignalR 从开发到生产部署避坑指南 tag: 浏览器--->nginx--&g ...

  3. How Javascript works (Javascript工作原理) (五) 深入理解 WebSockets 和带有 SSE 机制的HTTP/2 以及正确的使用姿势

    个人总结: 1.长连接机制——分清Websocket,http2,SSE: 1)HTTP/2 引进了 Server Push 技术用来让服务器主动向客户端缓存发送数据.然而,它并不允许直接向客户端程序 ...

  4. .NET应用程序调试—原理、工具、方法

    阅读目录: 1.背景介绍 2.基本原理(Windows调试工具箱..NET调试扩展SOS.DLL.SOSEX.DLL) 2.1.Windows调试工具箱 2.2..NET调试扩展包,SOS.DLL.S ...

  5. 对.Net WebSocket 和Socket的原理的思考

    今早上班路上接到了一个朋友的微信信息,问我对WebSocket 是否熟悉,一楞,印象之中没有用过这个类....来到公司后,得空问了一下度娘,原来这是一个随着HTML5推出的一种新协议,意义在于能实现浏 ...

  6. ASP.NET Core 运行原理解剖[4]:进入HttpContext的世界

    HttpContext是ASP.NET中的核心对象,每一个请求都会创建一个对应的HttpContext对象,我们的应用程序便是通过HttpContext对象来获取请求信息,最终生成响应,写回到Http ...

  7. MQTT, XMPP, WebSockets还是AMQP?泛谈实时通信协议选型 good

    Wolfram Hempel 是 deepstreamIO 的联合创始人.deepstreamIO 是一家位于德国的技术创业公司,为移动客户端.及物联网设备提供高性能.安全和可扩展的实时通信服务.文本 ...

  8. http-proxy-middleware使用方法和实现原理(源码解读)

    本文主要讲http-proxy-middleware用法和实现原理. 一 简介 http-proxy-middleware用于后台将请求转发给其它服务器. 例如:我们当前主机A为http://loca ...

  9. web安全之XSS攻击原理及防范

    阅读目录 一:什么是XSS攻击? 二:反射型XSS 三:存储型XSS 四:DOM-based型XSS 五:SQL注入 六:XSS如何防范? 1. cookie安全策略 2. X-XSS-Protect ...

  10. How Javascript works (Javascript工作原理) (七) WebAssembly 对比 JavaScript 及其使用场景

    个人总结: 1.webworkers实现了用多线程浏览器来进行多线程操作js的能力. 2.web workers不能操作dom,window,document等对象,一般用于cpu计算型的任务.   ...

随机推荐

  1. SQL通用语法和SQL分类

    SQL通用语法 1.SQL 语句可以单行或多行书写,以分号结尾 2.可使用空格和缩进来增强语句的可读性 3.MySQL 数据库的SQL语句不区分大小写,关键字建议使用大写 4.3种注释 单行注释: - ...

  2. Redis实现布隆过滤器解析

    布隆过滤器原理介绍 [1]概念说明 1)布隆过滤器(Bloom Filter)是1970年由布隆提出的.它实际上是一个很长的二进制向量和一系列随机映射函数.布隆过滤器可以用于检索一个元素是否在一个集合 ...

  3. 洛谷P2880 [USACO07JAN] Balanced Lineup G(树状数组/线段树)

    维护区间最值的模板题. 1.树状数组 1 #include<bits/stdc++.h> 2 //树状数组做法 3 using namespace std; 4 const int N=5 ...

  4. 洛谷P2168 [NOI2015] 荷马史诗 (哈夫曼树)

    学了哈夫曼树这道题还是好想的,基本上和构造哈夫曼树的思路一样,但是题目要求最长si的最小值,所以用两个关键字的堆,第一关键字是把出现次数作为权值,第二关键字表示从该节点开始的最长长度,权值相同时,选择 ...

  5. Hbase之shell基本操作

    一.系统命令 启动hbase Shell ./bin/hbase shell 获取帮助 help 查询服务器状态 status 查询hbase版本 version 查询表 list 获取表描述 des ...

  6. Rdt2.1 和 Rdt2.2的详细解释

    Rdt2.1 和 Rdt2.2的详细解释 目录 Rdt2.1 和 Rdt2.2的详细解释 这俩为啥会出现? 解决之道 Rdt 2.1 Rdt2.2 可靠数据传递中Rdt1.0, Rdt2.0, Rdt ...

  7. Linux实战笔记_CentOS7_格式化磁盘

    fdisk -l #检查是否添加成功(添加一块磁盘并重启计算机后) fdisk /dev/sdb #格式化磁盘 mount /dev/sdb1 /opt #挂载到/opt目录 df -h #查看是否挂 ...

  8. 2、yaml配置文件当中的坑(数字的定义和支持进制书写格式)

    6.进制数的转换 6.1.问题回顾 我记得我刚刚开始使用SpringBoot的时候,有一天在做到SpringBoot整合第三方技术的时候 我刚好在那天学习到整合Mybatis,做Web项目嘛,不连数据 ...

  9. Web自动化---解决登录页面随机验证码问题

    一.抛出问题 在日常的测试工作中,遇到了这样一个登录页面,如下图: 像我们之前做过UI自动化的同学就知道,自动输入账号和密码,这个简单,但是怎么样来识别验证码呢?验证码的形式有多种,有纯数字的,纯字母 ...

  10. vue-axios更改操作

    <template> <div class="nav"> <label for="">新部门</label>&l ...