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 Django(图文)
Nov 04 Python
Python代码的打包与发布详解
Jul 30 Python
Win7下搭建python开发环境图文教程(安装Python、pip、解释器)
May 17 Python
django站点管理详解
Dec 12 Python
opencv改变imshow窗口大小,窗口位置的方法
Apr 02 Python
python3.4.3下逐行读入txt文本并去重的方法
Apr 29 Python
python得到windows自启动列表的方法
Oct 14 Python
python 使用值来排序一个字典的方法
Nov 16 Python
python Pexpect 实现输密码 scp 拷贝的方法
Jan 03 Python
Python 实现自动获取种子磁力链接方式
Jan 16 Python
Python爬虫基于lxml解决数据编码乱码问题
Jul 31 Python
Python文件的操作示例的详细讲解
Apr 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
thinkphp连贯操作实例分析
2014/11/22 PHP
php将一维数组转换为每3个连续值组成的二维数组
2016/05/06 PHP
PHP数据库表操作的封装类及用法实例详解
2016/07/12 PHP
laravel 实现登陆后返回登陆前的页面方法
2019/10/03 PHP
yii框架结合charjs实现统计30天数据的方法
2020/04/04 PHP
分享一个自己写的table表格排序js插件(高效简洁)
2011/10/29 Javascript
常用Extjs工具:Extjs.util.Format使用方法
2012/03/22 Javascript
jQuery插件开发全解析
2012/10/10 Javascript
JQuery 获取Dom元素的实例讲解
2017/07/08 jQuery
详解vue前后台数据交互vue-resource文档
2017/07/19 Javascript
微信小程序中button组件的边框设置的实例详解
2017/09/27 Javascript
浅谈Vue2.0父子组件间事件派发机制
2018/01/08 Javascript
Bootstrap实现可折叠分组侧边导航菜单
2018/03/07 Javascript
JS实现长图上下滚动效果
2020/03/19 Javascript
解决echarts echarts数据动态更新和dataZoom被重置问题
2020/07/20 Javascript
[03:42]2014DOTA2国际邀请赛 第三日比赛排位扑朔迷离
2014/07/12 DOTA
[05:36]DOTA2 2015国际邀请赛中国区预选赛第四日TOP10
2015/05/29 DOTA
Python赋值语句后逗号的作用分析
2015/06/08 Python
python发送HTTP请求的方法小结
2015/07/08 Python
常用python编程模板汇总
2016/02/12 Python
Django使用Mysql数据库已经存在的数据表方法
2018/05/27 Python
Python实现的爬取百度贴吧图片功能完整示例
2019/05/10 Python
Python笔试面试题小结
2019/09/07 Python
Python Request类源码实现方法及原理解析
2020/08/17 Python
如何用Python 实现全连接神经网络(Multi-layer Perceptron)
2020/10/15 Python
matplotlib绘制鼠标的十字光标的实现(内置方式)
2021/01/06 Python
Jupyter安装拓展nbextensions及解决官网下载慢的问题
2021/03/03 Python
美国购买体育赛事门票网站:TicketCity
2019/03/06 全球购物
家得宝墨西哥官网:The Home Depot墨西哥
2019/11/18 全球购物
总监职责范文
2013/11/09 职场文书
销售职业生涯规划范文
2014/03/14 职场文书
老师对学生的评语
2014/04/18 职场文书
基本公共卫生服务健康教育工作方案
2014/05/22 职场文书
教师节晚会主持词
2015/06/30 职场文书
Pytorch使用shuffle打乱数据的操作
2021/05/20 Python
redis sentinel监控高可用集群实现的配置步骤
2022/04/01 Redis