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 相关文章推荐
记录Django开发心得
Jul 16 Python
python类继承用法实例分析
Oct 10 Python
Python简单定义与使用字典dict的方法示例
Jul 25 Python
浅析Git版本控制器使用
Dec 10 Python
在django中实现页面倒数几秒后自动跳转的例子
Aug 16 Python
python+selenium 点击单选框-radio的实现方法
Sep 03 Python
python使用PIL剪切和拼接图片
Mar 23 Python
python实现音乐播放和下载小程序功能
Apr 26 Python
django在开发中取消外键约束的实现
May 20 Python
基于Pytorch版yolov5的滑块验证码破解思路详解
Feb 25 Python
python实现杨辉三角的几种方法代码实例
Mar 02 Python
pycharm 如何查看某一函数源码的快捷键
May 12 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
第十三节 对象串行化 [13]
2006/10/09 PHP
php ci框架中加载css和js文件失败的解决方法
2014/03/03 PHP
php支付宝在线支付接口开发教程
2016/09/19 PHP
Prototype使用指南之dom.js
2007/01/10 Javascript
Extjs学习笔记之七 布局
2010/01/08 Javascript
javascript随机之洗牌算法深入分析
2014/06/07 Javascript
详解js闭包
2014/09/02 Javascript
Jquery树插件zTree用法入门教程
2015/02/17 Javascript
javascript跨域的方法汇总
2015/10/23 Javascript
基于React.js实现原生js拖拽效果引发的思考
2016/03/30 Javascript
JS函数的定义与调用方法推荐
2016/05/12 Javascript
jQuery实现倒计时(倒计时年月日可自己输入)
2016/12/02 Javascript
element-ui 表格实现单元格可编辑的示例
2018/02/26 Javascript
vue使用自定义icon图标的方法
2018/05/14 Javascript
React 无状态组件(Stateless Component) 与高阶组件
2018/08/14 Javascript
Vue数据双向绑定原理实例解析
2020/05/15 Javascript
[42:52]IG vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python分析网页上所有超链接的方法
2015/05/08 Python
快速解决安装python没有scripts文件夹的问题
2018/04/03 Python
通过Pandas读取大文件的实例
2018/06/07 Python
基于python实现名片管理系统
2018/11/30 Python
python模块常用用法实例详解
2019/10/17 Python
django中media媒体路径设置的步骤
2019/11/15 Python
TensorFLow 不同大小图片的TFrecords存取实例
2020/01/20 Python
Python任务自动化工具tox使用教程
2020/03/17 Python
Python实现打包成库供别的模块调用
2020/07/13 Python
html5 Canvas画图教程(10)—把面拆成线条模拟出圆角矩形
2013/01/09 HTML / CSS
分享29个基于Bootstrap的HTML5响应式网页设计模板
2015/11/19 HTML / CSS
德国运动鞋网上商店:Afew Store
2018/01/05 全球购物
急诊科护士自我鉴定
2013/10/14 职场文书
银行财务部实习生的自我鉴定
2013/11/27 职场文书
应用数学专业求职信
2014/03/14 职场文书
安装工程师岗位职责
2015/02/13 职场文书
大学生实习介绍信
2015/05/05 职场文书
2015年安全生产管理工作总结
2015/05/25 职场文书
实习单位鉴定意见
2015/06/04 职场文书