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自定义进程池实例分析【生产者、消费者模型问题】
Sep 19 Python
利用Python中SocketServer 实现客户端与服务器间非阻塞通信
Dec 15 Python
python3 模拟登录v2ex实例讲解
Jul 13 Python
Python文件监听工具pyinotify与watchdog实例
Oct 15 Python
Python实现计算文件MD5和SHA1的方法示例
Jun 11 Python
基于python2.7实现图形密码生成器的实例代码
Nov 05 Python
Windows下python3安装tkinter的问题及解决方法
Jan 06 Python
matlab灰度图像调整及imadjust函数的用法详解
Feb 27 Python
实现ECharts双Y轴左右刻度线一致的例子
May 16 Python
在pycharm中debug 实时查看数据操作(交互式)
Jun 09 Python
Python中的xlrd模块使用整理
Jun 15 Python
Pytest中conftest.py的用法
Jun 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
杏林同学录(八)
2006/10/09 PHP
用PHP函数解决SQL injection
2006/12/09 PHP
php 生成自动创建文件夹并上传文件的示例代码
2014/03/07 PHP
深入理解PHP内核(二)之SAPI探究
2015/11/10 PHP
JavaScript高级程序设计 阅读笔记(十四) js继承机制的实现
2012/08/14 Javascript
JavaScript判断变量是否为空的自定义函数分享
2015/01/31 Javascript
js焦点文字滚动效果代码分享
2015/08/25 Javascript
利用JS生成博文目录及CSS定制博客
2016/02/10 Javascript
javascript三种代码注释方法
2016/06/02 Javascript
Angular.JS判断复选框checkbox是否选中并实时显示
2016/11/30 Javascript
详解js正则表达式验证时间格式xxxx-xx-xx形式
2018/02/09 Javascript
vue实现动态列表点击各行换色的方法
2018/09/13 Javascript
深入理解与使用keep-alive(配合router-view缓存整个路由页面)
2018/09/25 Javascript
使用angularjs.foreach时return的问题解决
2018/09/30 Javascript
angularJs复选框checkbox选中进行ng-show显示隐藏的方法
2018/10/08 Javascript
BootStrap modal实现拖拽功能
2018/12/01 Javascript
Vuex中的Mutations的具体使用方法
2020/06/01 Javascript
vue项目中使用多选框的实例代码
2020/07/22 Javascript
Django中使用Celery的方法示例
2018/11/29 Python
在python下使用tensorflow判断是否存在文件夹的实例
2019/06/10 Python
Python3 执行Linux Bash命令的方法
2019/07/12 Python
Python数据可视化:箱线图多种库画法
2019/11/06 Python
Python程序暂停的正常处理方法
2019/11/07 Python
如何使用Python破解ZIP或RAR压缩文件密码
2020/01/09 Python
python常用运维脚本实例小结
2020/02/14 Python
从多个tfrecord文件中无限读取文件的例子
2020/02/17 Python
django queryset相加和筛选教程
2020/05/18 Python
什么是托管函数?托管函数有什么用?
2014/06/15 面试题
服务型党组织建设典型材料
2014/05/07 职场文书
考博专家推荐信
2014/05/10 职场文书
国际贸易专业求职信
2014/06/04 职场文书
2014年初中班主任工作总结
2014/11/08 职场文书
2015年计划生育协会工作总结
2015/05/13 职场文书
2016感恩父亲节主题广播稿
2015/12/18 职场文书
python pyhs2 的安装操作
2021/04/07 Python
为什么MySQL分页用limit会越来越慢
2021/07/25 MySQL