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修改字典内key对应值的方法
Jul 11 Python
浅析Python中else语句块的使用技巧
Jun 16 Python
python 读取目录下csv文件并绘制曲线v111的方法
Jul 06 Python
启动Atom并运行python文件的步骤
Nov 09 Python
python语言基本语句用法总结
Jun 11 Python
python中append实例用法总结
Jul 30 Python
TensorFlow实现打印每一层的输出
Jan 21 Python
Python如何将函数值赋给变量
Apr 28 Python
浅谈cv2.imread()和keras.preprocessing中的image.load_img()区别
Jun 12 Python
Anaconda详细安装步骤图文教程
Nov 12 Python
Python函数中的不定长参数相关知识总结
Jun 24 Python
python数字转对应中文的方法总结
Aug 02 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
使用MaxMind 根据IP地址对访问者定位
2006/10/09 PHP
一个从别的网站抓取信息的例子(域名查询)
2006/10/09 PHP
php数组中删除元素之重新索引的方法
2014/09/16 PHP
彻底删除thinkphp3.1案例blog标签的方法
2014/12/05 PHP
最新最全PHP生成制作验证码代码详解(推荐)
2016/06/12 PHP
PHP中的多种加密技术及代码示例解析
2016/10/20 PHP
PHP使用标准库spl实现的观察者模式示例
2018/08/04 PHP
Laravel 连接(Join)示例
2019/10/16 PHP
javascript实现的listview效果
2007/04/28 Javascript
JSON 入门指南 想了解json的朋友可以看下
2009/08/26 Javascript
jQuery 属性选择器element[herf*='value']使用示例
2013/10/20 Javascript
使用正则表达式的格式化与高亮显示json字符串
2014/12/03 Javascript
JS动画效果打开、关闭层的实现方法
2015/05/09 Javascript
实例解析jQuery插件EasyUI最常用的表单验证规则
2015/11/29 Javascript
JS 拦截全局ajax请求实例解析
2016/11/29 Javascript
开发Vue树形组件的示例代码
2017/12/21 Javascript
vue 做移动端微信公众号采坑经验记录
2018/04/26 Javascript
Node.js搭建WEB服务器的示例代码
2018/08/15 Javascript
jQuery表单选择器用法详解
2019/08/22 jQuery
python处理文本文件并生成指定格式的文件
2014/07/31 Python
Python深入学习之内存管理
2014/08/31 Python
python使用udp实现聊天器功能
2018/12/10 Python
python+selenium select下拉选择框定位处理方法
2019/08/24 Python
Python绘制三角函数图(sin\cos\tan)并标注特定范围的例子
2019/12/04 Python
python3中numpy函数tile的用法详解
2019/12/04 Python
浅谈keras中的batch_dot,dot方法和TensorFlow的matmul
2020/06/18 Python
Python限制内存和CPU使用量的方法(Unix系统适用)
2020/08/04 Python
torchxrayvision包安装过程(附pytorch1.6cpu版安装)
2020/08/26 Python
手机端用rem+scss做适配的详解
2017/11/15 HTML / CSS
C语言笔试题回忆
2015/04/02 面试题
2014端午节活动策划方案
2014/01/27 职场文书
公司经理任命书
2014/06/05 职场文书
三八妇女节慰问信
2015/02/14 职场文书
2015年采购工作总结
2015/04/10 职场文书
2015年公司后勤管理工作总结
2015/05/13 职场文书
高一作文之乐趣
2019/11/21 职场文书