一、说明

1.1 背景说明

前端时间同事说云平台通信使用了一个websocket的东西,今天抽空来看一下具体是怎么个通信过程。

从形式上看,websocket是一个应用层协议,socket是数据链路层、网络层、传输层的抽象;从应用场合上看,websocket可以使用javascript实现,而socket不能用javascript实现;从实际效果上看,和一般的socket连接用起来没什么区别。

我们知道http是短连接的,反复建立和销毁连接比较耗费资源,另外http协议经常头部内容比主体内容还长也比较浪费资源;websocket可以认为是一个内容使用载荷固定格式的socket长连接。

websocket基本协议格式如下,更多说明见RFC 6455:

1.2 环境说明

当前环境我使用Python3+WebSockets库,WebSockets直接使用pip安装即可:

pip install websockets

二、代码实现

长连接是有状态的,所以一般在且只在最开始进行一次身份认证,而后通信过程是不需要认证信息。我们这里实现一个简单的用户名密码认证过程。长连接更多内容可参考"连接与短连接的安全差异讨论 ”。

另外,注意把代码中的ip改成自己的。

2.1 python服务端代码

import asyncio
import websockets# 检测客户端权限,用户名密码通过才能推出循环
async def check_permit(websocket):while True:recv_str = await websocket.recv()cred_dict = recv_str.split(":")if cred_dict[0] == "admin" and cred_dict[1] == "123456":response_str = "congratulation, you have connect with server\r\nnow, you can do something else"await websocket.send(response_str)return Trueelse:response_str = "sorry, the username or password is wrong, please submit again"await websocket.send(response_str)# 接收客户端消息并处理,这里只是简单把客户端发来的返回回去
async def recv_msg(websocket):while True:recv_text = await websocket.recv()response_text = f"your submit context:{recv_text}"await websocket.send(response_text)# 服务器端主逻辑
async def main_logic(websocket, path):await check_permit(websocket)await recv_msg(websocket)start_server = websockets.serve(main_logic, '10.10.6.91', 5678)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()

2.2 python版客户端代码

import asyncio
import websockets# 向服务器端认证,用户名密码通过才能退出循环
async def auth_system(websocket):while True:cred_text = input("please enter your username and password:")await websocket.send(cred_text)response_str = await websocket.recv()if "congratulation' in response_str:return True# 向服务器端发送认证后的消息
async def send_msg(websocket):while True:_text = input("please enter your context:")if _text == "exit":print(f'you have enter "exit", goodbye')await websocket.close(reason="user exit")return Falseawait websocket.send(_text)recv_text = await websocket.recv()print(f"{recv_text}")# 客户端主逻辑
async def main_logic():async with websockets.connect('ws://10.10.6.91:5678') as websocket:await auth_system(websocket)await send_msg(websocket)asyncio.get_event_loop().run_until_complete(main_logic())

2.3 html版客户端代码

html版客户端代码,只能通过回调函数接收服务端返回的数据,不能主动接收,感觉怪怪的。

<!DOCTYPE HTML>
<html><head><meta charset="utf-8"><title>websocket通信客户端</title><script type="text/javascript">function WebSocketTest() {if ("WebSocket" in window) {// 打开一个web socketvar ws = new WebSocket("ws://10.10.6.91:5678");// 连接建立后的回调函数ws.onopen = function() {//Web Socket已连接上,使用send()方法发送数据ws.send("admin:123456");alert("正在发送:admin:123456");};//接收到服务器消息后的回调函数ws.onmessage = function (evt) {var received_msg = evt.data;if (received_msg.indexOf("sorry") == -1) {alert("收到消息:"+received_msg);}};// 连接关闭后的回调函数ws.onclose = function() {//关闭websocketalert("连接已关闭...");};} else {//浏览器不支持WebSocketalert("您的浏览器不支持 WebSocket!");}}</script></head><body onload="WebSocketTest()"></body>
</html>

三、通信数据包截获及通信过程分析

以下数据包基于上边的python服务端和html版客户端,再次强调注意把代码中的ip改成自己电脑当前的ip。

3.1 wireshark通信数据包截获及通信过程分析

wireshark拦截数据包后可使用过滤器表达式"websocket"进行过滤:

我们追踪数据流可以更清晰地看清websocket的通信过程,可以看到先是用http完成了建立连接,然后切换到websocket协议。

再看具体数据流也确实如此,先用两个http包建立连接,而后是websocket通信.

3.2 burpsuite通信数据包截获及通信过程分析

和正常配置代理即可,burpsuite能识别和拦截websocket数据包,如下图:

不过和一般http请求有区别的是,websocket请求会被单独汇总到“WebSocket history”选项卡,而不是和http请求混在"HTTP history"选项卡。

3.3 开发者工具通信数据包截获及通信过程分析

FIreFox开发者工具只能看到简历websocket连接的两个http数据包,没看到怎么查看具体传输内容,Chrome开发者工具Frames选项卡可以,如下:

参考:

https://websockets.readthedocs.io/en/stable/intro.html

https://www.runoob.com/html/html5-websocket.html

Python3+WebSockets实现WebSocket通信相关推荐

  1. WebSocket 通信原理和详细使用(十六)

    今天我们详细分析WebSocket 通信原理和使用 一.什么是 WebSocket ? WebSocket --一种在 2011 年被互联网工程任务组( IETF )标准化的协议.WebSocket ...

  2. 基于asp.netCoreWebApi的webSocket通信示例(net6)

    背景: 在阿里云服务器中搭建了常规的tcp server服务(基于.net framework 4.0).用以实现远程控制家里的鱼缸灯,办公室的电脑开关机等功能.客户端采用PC桌面端和微信小程序端. ...

  3. python websocket_python 模拟websocket通信

    以前,很多网站使用轮询实现推送技术.轮询是在特定的的时间间隔(比如1秒),由浏览器对服务器发出HTTP request,然后由服务器返回最新的数据给浏览器.轮询的缺点很明显,浏览器需要不断的向服务器发 ...

  4. dotnet core使用websocket通信

    dotnet core5.0 dotnet core支持websocket通信配置如下 app.UseWebSockets(new WebSocketOptions() {KeepAliveInter ...

  5. C#(SuperWebSocket)与websocket通信

    原文:C#(SuperWebSocket)与websocket通信 客户端代码 点击可以查看一些关于websocket的介绍 1 <!DOCTYPE html> 2 <html> ...

  6. 《 Socket.IO》 解决 WebSocket 通信

    大家好呀,我是小菜~ 本文主要介绍 Socket.IO 微信公众号已开启,小菜良记,没关注的同学们记得关注哦! 在介绍 Socket.IO 之前, 我们先考虑一个问题, 如果这个时候有个需求, 类似实 ...

  7. 微信小程序 WebSocket 通信 —— 在线聊天

    在Node栏目就讲到了Socket通信的内容,使用Node实现Socke通信,还使用两个流行的WebSocket 库,ws 和 socket.io,在小程序中的WebSocket接口和HTML5的We ...

  8. 请使用netty框架实现高效稳定的websocket通信

    Netty 是一个异步事件驱动的网络应用框架,提供了一种高效稳定的方法来实现 WebSocket 通信. 要使用 Netty 实现 WebSocket 通信,需要执行以下步骤: 创建一个新的 Nett ...

  9. 在vue中webSocket通信

    1.简单介绍 基于webSocket通信的库主要有 socket.io,SockJS,这次用的是 SockJS. 2.前提 这里我们使用sockjs-client.stomjs这两个模块,要实现web ...

最新文章

  1. 关于android相机开发中遇到的内存溢出的问题
  2. Microsoft Teams快速上手系列-06邀请组织外部用户加入团队
  3. 一步一步学Linq to sql(七):并发与事务
  4. Ansible搭建hadoop3.1.3高可用集群
  5. mockjs中的方法(三)
  6. 工作六年的前端开发在想什么
  7. Transformers中的Beam Search高效实现
  8. 斯坦福与苹果基于Apple Watch检测心率异常,0.5%人群被检出,其中84%患有房颤...
  9. mysql urlencode 中文_php url中文转码的方法
  10. c语言setw,C++ iomanip setw()用法及代码示例
  11. 计算机系统汉字编码分为,计算机中的汉字编码
  12. html 实现动态在线预览word、excel、pdf等文件(方便快捷)
  13. 漫画 | 揭密微信诞生记之民间传说
  14. 关于高分辨率屏幕中VMware虚拟机的一些问题的解决
  15. Caffe-Ristretto源码解读
  16. VS2019设置easyx图形库
  17. 1016: 银行利率 Python
  18. python数据挖掘课程 十.Pandas、Matplotlib、PCA绘图实用代码补充
  19. binary,varbinary,image的区别
  20. 两条命令解决移动硬盘无法弹出的问题

热门文章

  1. richtextbox自动滚动到最下面_自动滚动式连续真空包装机简介
  2. 函数式接口@FunctionalInterface使用示例
  3. 小程序同时设置点击跳转与自动跳转导致重复跳转的问题及解决
  4. CSS盒子模型的使用及其注意事项——响应式Web系列学习笔记
  5. InnoDB 的索引模型
  6. Web前端开发笔记——第二章 HTML语言 第五节 图像标签
  7. 计算机网络实验(华为eNSP模拟器)——第二章 VRP通用路由平台介绍
  8. MHA+LAMP+Keepalived实现高可负载均衡综合实验
  9. 为你讲解ELK的组成与部署
  10. python大括号用法_Python中各种括号的区别、用途及使用方法