websockets的原理

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


websocket(ws协议原理) 服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息
特点: (1)建立在 TCP 协议之上,服务器端的实现比较容易。
(2)与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。
(3)数据格式比较轻量,性能开销小,通信高效。
(4)可以发送文本,也可以发送二进制数据。
(5)没有同源限制,客户端可以与任意服务器通信。
(6)协议标识符是ws(如果加密,则为wss),服务器网址就是 URL。
使用:
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、websocket的关键词
websocket本身就是一个关键词,因为每次使用都需要自定义
webSocket.readyState 返回实例对象的当前状态
webSocket.onopen 用于指定连接成功后的回调函数 (因为解密我们关心cookie/tooken等)
webSocket.onclose 用于指定连接关闭后的回调函数
webSocket.onmessage 指定收到服务器数据后的回调函数 (因为解密我们关心)
webSocket.send() 用于向服务器发送数据 (因为解密我们关心加密的内容和算法)
webSocket.bufferedAmount 判断发送是否结束
webSocket.onerror 用于指定报错时的回调函数
连接包和心跳包:
连接包:webSocket.onopen
心跳包:如果出现断电等情况,需要让服务器知道我下线,
不再等我,客户端每隔一段时间(等30s)发一个没有信息
用于告诉服务器我还在线。否则会被踢出。那么我们爬取的
的时候还要注意心跳包的存在。
练习:网站(蝌蚪聊天室 http://www.wodexiaoshijie.com/kedou/)
抓包
分析包的信息
调试
本地运行

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

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

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

上一篇:python3 通过websockets发送wss请求的例子


下一篇:FastAPI 学习之路(五十一)WebSockets(七)实现一对一聊天