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在命令行下使用google翻译(带语音)
Jan 16 Python
python小技巧之批量抓取美女图片
Jun 06 Python
Python实现监控程序执行时间并将其写入日志的方法
Jun 30 Python
python实现远程通过网络邮件控制计算机重启或关机
Feb 22 Python
浅谈Python反射 &amp; 单例模式
Mar 21 Python
python与字符编码问题
May 24 Python
python 数据提取及拆分的实现代码
Aug 26 Python
简单了解python数组的基本操作
Nov 26 Python
基于python监控程序是否关闭
Jan 14 Python
python异步Web框架sanic的实现
Apr 27 Python
Python如何脚本过滤文件中的注释
May 27 Python
Python日志器使用方法及原理解析
Sep 27 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
上海永华YH-R296(华普R-96)12波段立体声收音机的分析和打理
2021/03/02 无线电
aspx中利用js实现确认删除代码
2010/07/22 Javascript
jquery如何判断某元素是否具备指定的样式
2013/11/05 Javascript
jquery实现网页查找功能示例分享
2014/02/12 Javascript
Node.js文件操作详解
2014/08/16 Javascript
JavaScript调试工具汇总
2014/12/23 Javascript
JavaScript中的方法调用详细介绍
2014/12/30 Javascript
js实现的奥运倒计时时钟效果代码
2015/12/09 Javascript
使用jquery如何获取时间
2016/10/13 Javascript
CentOS环境中MySQL修改root密码方法
2018/01/07 Javascript
微信小程序switch开关选择器使用详解
2018/01/31 Javascript
解决vue路由后界面没有变化,但是链接有的问题
2018/09/01 Javascript
js中的闭包实例展示
2018/11/01 Javascript
vue 内置过滤器的使用总结(附加自定义过滤器)
2018/12/11 Javascript
Vue核心概念Action的总结
2019/01/18 Javascript
小程序中canvas的drawImage方法参数使用详解
2019/07/04 Javascript
JS严格模式原理与用法实例分析
2020/04/27 Javascript
[02:18]《我与DAC》之工作人员:为了热爱DOTA2的玩家们
2018/03/28 DOTA
[07:54]DOTA2-DPC中国联赛 正赛 iG vs VG 选手采访
2021/03/11 DOTA
基于DataFrame筛选数据与loc的用法详解
2018/05/18 Python
python3字符串操作总结
2019/07/24 Python
Pyorch之numpy与torch之间相互转换方式
2019/12/31 Python
详解Python实现进度条的4种方式
2020/01/15 Python
python有序查找算法 二分法实例解析
2020/02/18 Python
解决Django响应JsonResponse返回json格式数据报错问题
2020/08/09 Python
HTML5单选框、复选框、下拉菜单、文本域的实现代码
2020/12/01 HTML / CSS
倩碧香港官方网站:Clinique香港
2017/11/13 全球购物
酒店管理自荐信
2013/10/23 职场文书
毕业自荐信
2013/12/16 职场文书
优秀的茶餐厅创业计划书
2014/01/03 职场文书
观看信仰心得体会
2014/09/04 职场文书
催款律师函范文
2015/05/27 职场文书
运动会报道稿大全
2015/07/23 职场文书
当你找不到方向的时候,不妨读读刘备的一生
2019/08/05 职场文书
golang 如何通过反射创建新对象
2021/04/28 Golang
Python django中如何使用restful框架
2021/06/23 Python