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中用keys()方法返回字典键的教程
May 21 Python
Python的Django框架安装全攻略
Jul 15 Python
Python语言的面相对象编程方式初步学习
Mar 12 Python
python利用正则表达式提取字符串
Dec 08 Python
详解python之多进程和进程池(Processing库)
Jun 09 Python
python自动化脚本安装指定版本python环境详解
Sep 14 Python
查看python安装路径及pip安装的包列表及路径
Apr 03 Python
详解python中递归函数
Apr 16 Python
Python3.5 Pandas模块缺失值处理和层次索引实例详解
Apr 23 Python
PyCharm2020.1.1与Python3.7.7的安装教程图文详解
Aug 07 Python
Python爬虫之App爬虫视频下载的实现
Dec 08 Python
Python基础之pandas数据合并
Apr 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
晶体管来复再生式二管收音机
2021/03/02 无线电
杏林同学录(七)
2006/10/09 PHP
php echo 输出字符串函数详解
2010/05/13 PHP
PHP中数组定义的几种方法
2013/09/01 PHP
PHP技术开发微信公众平台
2015/07/22 PHP
php实现当前页面点击下载文件的简单方法
2016/09/22 PHP
php从数据库中读取特定的行(实例)
2017/06/02 PHP
jQuery数据缓存功能的实现思路及简单模拟
2013/05/27 Javascript
jquery实现div拖拽宽度示例代码
2013/07/31 Javascript
JS和JQUERY获取页面大小,滚动条位置,元素位置(示例代码)
2013/12/14 Javascript
jquery教程限制文本框只能输入数字和小数点示例分享
2014/01/13 Javascript
节点的插入之append()和appendTo()的用法介绍
2014/01/13 Javascript
js获取select默认选中的Option并不是当前选中值
2014/05/07 Javascript
测试IE浏览器对JavaScript的AngularJS的兼容性
2015/06/19 Javascript
JS实现仿QQ效果的三级竖向菜单
2015/09/25 Javascript
详解js中常规日期格式处理、月历渲染和倒计时函数
2016/12/28 Javascript
javascript设计模式之模块模式学习笔记
2017/02/15 Javascript
angular4 JavaScript内存溢出问题
2018/03/06 Javascript
vue下拉列表功能实例代码
2018/04/08 Javascript
详解微信小程序之一键复制到剪切板
2019/04/24 Javascript
js实现简单放大镜效果
2020/03/07 Javascript
[01:23]一分钟告诉你 DOTA2为什么叫信仰2
2014/06/20 DOTA
pygame加载中文名mp3文件出现error
2017/03/31 Python
python输入整条数据分割存入数组的方法
2018/11/13 Python
Python3.5实现的三级菜单功能示例
2019/03/25 Python
python实现关闭第三方窗口的方法
2019/06/28 Python
python运用pygame库实现双人弹球小游戏
2019/11/25 Python
Python面向对象程序设计之静态方法、类方法、属性方法原理与用法分析
2020/03/23 Python
FOREO官方网站:LUNA露娜洁面仪
2016/11/28 全球购物
实习生自我评价
2014/01/18 职场文书
咖啡店自主创业商业计划书
2014/01/22 职场文书
中小学教师继续教育心得体会
2016/01/19 职场文书
nginx如何将http访问的网站改成https访问
2021/03/31 Servers
Python爬虫进阶之Beautiful Soup库详解
2021/04/29 Python
MySQL事务的隔离级别详情
2022/07/15 MySQL
MySQL池化框架学习接池自定义
2022/07/23 MySQL