Python Websocket服务端通信的使用示例


Posted in Python onFebruary 25, 2020

1、唠唠叨叨

最近又回顾了下Websocket,发现已经忘的七七八八了。于是用js写了客户端,用python写了服务端,来复习一下这方面的知识。

WebSocket 是一种标准协议,用于在客户端和服务端之间进行双向数据传输。但它跟 HTTP 没什么关系,它是基于 TCP 的一种独立实现。

以前客户端想知道服务端的处理进度,要不停地使用 Ajax 进行轮询,让浏览器隔个几秒就向服务器发一次请求,这对服务器压力较大。另外一种轮询就是采用 long poll 的方式,这就跟打电话差不多,没收到消息就一直不挂电话,也就是说,客户端发起连接后,如果没消息,就一直不返回 Response 给客户端,连接阶段一直是阻塞的。

而 WebSocket 解决了 HTTP 的这几个难题。当服务器完成协议升级后( HTTP -> WebSocket ),服务端可以主动推送信息给客户端,解决了轮询造成的同步延迟问题。由于 WebSocket 只需要一次 HTTP 握手,服务端就能一直与客户端保持通信,直到关闭连接,这样就解决了服务器需要反复解析 HTTP 协议,减少了资源的开销。

2、先看一下效果吧

2.1、效果1(一个客户端连上服务的并发送消息)

Python Websocket服务端通信的使用示例

2.2、效果2(另一个客户端连上服务的并发送消息)

Python Websocket服务端通信的使用示例

2.3、效果3(服务的收到客户端的全部消息并返回消息)

Python Websocket服务端通信的使用示例

2.4、效果4(一个客户端掉线并不影响其它socket连接)

Python Websocket服务端通信的使用示例

2.5、效果5(列取全部连接客户端对象和当前发消息的客户端对象)

Python Websocket服务端通信的使用示例

3、核心代码

3.1、Python

#! -*- coding: utf-8 -*-
"""
Author: ZhenYuSha
Create Time: 2019-1-14
Info: Websocket 的使用示例
"""
import asyncio
import websockets

websocket_users = set()


# 检测客户端权限,用户名密码通过才能退出循环
async def check_user_permit(websocket):
 print("new websocket_users:", websocket)
 websocket_users.add(websocket)
 print("websocket_users list:", websocket_users)
 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..."
   await websocket.send(response_str)
   print("Password is ok...")
   return True
  else:
   response_str = "Sorry, please input the username or password..."
   print("Password is wrong...")
   await websocket.send(response_str)


# 接收客户端消息并处理,这里只是简单把客户端发来的返回回去
async def recv_user_msg(websocket):
 while True:
  recv_text = await websocket.recv()
  print("recv_text:", websocket.pong, recv_text)
  response_text = f"Server return: {recv_text}"
  print("response_text:", response_text)
  await websocket.send(response_text)


# 服务器端主逻辑
async def run(websocket, path):
 while True:
  try:
   await check_user_permit(websocket)
   await recv_user_msg(websocket)
  except websockets.ConnectionClosed:
   print("ConnectionClosed...", path) # 链接断开
   print("websocket_users old:", websocket_users)
   websocket_users.remove(websocket)
   print("websocket_users new:", websocket_users)
   break
  except websockets.InvalidState:
   print("InvalidState...") # 无效状态
   break
  except Exception as e:
   print("Exception:", e)


if __name__ == '__main__':
 print("127.0.0.1:8181 websocket...")
 asyncio.get_event_loop().run_until_complete(websockets.serve(run, "127.0.0.1", 8181))
 asyncio.get_event_loop().run_forever()

3.2、Html(JS)

<script>
  var socket;
  if ("WebSocket" in window) {
   var ws = new WebSocket("ws://127.0.0.1:8181/test");
   socket = ws;
   ws.onopen = function() {
    console.log('连接成功');
    alert("连接成功, 请输入账号和密码");
   };
   ws.onmessage = function(evt) {
    var received_msg = evt.data;
    document.getElementById("showMes").value+=received_msg+"\n";
   };
   ws.onclose = function() {
    alert("断开了连接");
   };
  } else {
   alert("浏览器不支持WebSocket");
  }
  function sendMeg(){
   var message=document.getElementById("name").value+":"+document.getElementById("mes").value;
   document.getElementById("showMes").value+=message+"\n\n";
   socket.send(message);
  }
 </script>

4、Github源码分享

https://github.com/ShaShiDiZhuanLan/Demo_Socket_Python

到此这篇关于Python Websocket服务端通信的使用示例的文章就介绍到这了,更多相关Python Websocket服务端通信内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python正则捕获操作示例
Aug 19 Python
用python生成1000个txt文件的方法
Oct 25 Python
python实现网页自动签到功能
Jan 21 Python
在SQLite-Python中实现返回、查询中文字段的方法
Jul 17 Python
Python命令行参数解析工具 docopt 安装和应用过程详解
Sep 26 Python
python matplotlib画盒图、子图解决坐标轴标签重叠的问题
Jan 19 Python
Python图像处理库PIL的ImageFont模块使用介绍
Feb 26 Python
python 安装教程之Pycharm安装及配置字体主题,换行,自动更新
Mar 13 Python
利用python绘制数据曲线图的实现
Apr 09 Python
python开发一个解析protobuf文件的简单编译器
Nov 17 Python
python Protobuf定义消息类型知识点讲解
Mar 02 Python
python实战之用emoji表情生成文字
May 08 Python
Python GUI库PyQt5样式QSS子控件介绍
Feb 25 #Python
浅谈python累加求和+奇偶数求和_break_continue
Feb 25 #Python
Python GUI库PyQt5图形和特效样式QSS介绍
Feb 25 #Python
python 伯努利分布详解
Feb 25 #Python
Python3如何在Windows和Linux上打包
Feb 25 #Python
python实现可下载音乐的音乐播放器
Feb 25 #Python
Python实现分数序列求和
Feb 25 #Python
You might like
PHP中foreach循环中使用引用要注意的地方
2011/01/02 PHP
分割GBK中文遭遇乱码的解决方法
2013/08/09 PHP
ThinkPHP分页实例
2014/10/15 PHP
Windows2003下php5.4安装配置教程(IIS)
2016/06/30 PHP
PHP AjaxForm提交图片上传并显示图片源码
2016/11/29 PHP
php生成复杂验证码(倾斜,正弦干扰线,黏贴,旋转)
2018/03/12 PHP
javascript中有趣的反柯里化深入分析
2012/12/05 Javascript
Iframe 自动适应页面的高度示例代码
2014/02/26 Javascript
将form表单中的元素转换成对象的方法适用表单提交
2014/05/02 Javascript
jQuery实现径向动画菜单效果
2015/07/17 Javascript
JS实现获取剪贴板内容的方法
2016/06/21 Javascript
浅谈javascript中的三种弹窗
2016/10/21 Javascript
JavaScript实现邮箱地址自动匹配功能代码
2016/11/28 Javascript
使用bootstrap插件实现模态框效果
2017/05/10 Javascript
vue2单元测试环境搭建
2018/05/24 Javascript
解决vue同一slot在组件中渲染多次的问题
2018/09/06 Javascript
vue中的计算属性实例详解
2018/09/19 Javascript
vue中进入详情页记住滚动位置的方法(keep-alive)
2018/09/21 Javascript
浅谈一个webpack构建速度优化误区
2019/06/24 Javascript
vue中使用v-model完成组件间的通信
2019/08/22 Javascript
加速vue组件渲染之性能优化
2020/04/09 Javascript
详解Python中的各种函数的使用
2015/05/24 Python
Python学习小技巧之利用字典的默认行为
2017/05/20 Python
python 中字典嵌套列表的方法
2018/07/03 Python
python二进制读写及特殊码同步实现详解
2019/10/11 Python
Django REST framework 单元测试实例解析
2019/11/07 Python
巴西宠物店在线:Geração Pet
2017/05/31 全球购物
BrandAlley英国:法国折扣奢侈品网上零售商
2017/07/03 全球购物
为娇小女性量身打造:Petite Studio
2018/11/01 全球购物
法国春天百货官网:Printemps.com
2020/06/29 全球购物
大门门卫岗位职责
2013/11/30 职场文书
创先争优标语
2014/06/27 职场文书
小学清明节活动总结
2014/07/04 职场文书
车队安全员岗位职责
2015/02/15 职场文书
担保贷款承诺书
2015/04/30 职场文书
一些让Python代码简洁的实用技巧总结
2021/08/23 Python