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 生成不重复的随机数的代码
May 15 Python
python的tkinter布局之简单的聊天窗口实现方法
Sep 03 Python
Python学习之asyncore模块用法实例教程
Sep 29 Python
Python遍历numpy数组的实例
Apr 04 Python
Python使用Pandas对csv文件进行数据处理的方法
Aug 01 Python
基于 Django 的手机管理系统实现过程详解
Aug 16 Python
详解python中docx库的安装过程
Nov 08 Python
通过python扫描二维码/条形码并打印数据
Nov 14 Python
python3 dict ndarray 存成json,并保留原数据精度的实例
Dec 06 Python
Python reversed函数及使用方法解析
Mar 17 Python
Python urlopen()参数代码示例解析
Dec 10 Python
聊一聊python常用的编程模块
May 14 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
深思 PHP 数组遍历的差异(array_diff 的实现)
2008/03/23 PHP
php $_SERVER[&quot;REQUEST_URI&quot;]获取值的通用解决方法
2010/06/21 PHP
Yii不依赖Model的表单生成器用法实例
2014/12/04 PHP
PHP实现基本留言板功能原理与步骤详解
2020/03/26 PHP
Jquery 组合form元素为json格式,asp.net反序列化
2009/07/09 Javascript
小议javascript 设计模式 推荐
2009/10/28 Javascript
用原生JavaScript实现jQuery的$.getJSON的解决方法
2013/05/03 Javascript
Node.js模块加载详解
2014/08/16 Javascript
Node.js中使用jQuery的做法
2016/08/17 Javascript
Angular.JS判断复选框checkbox是否选中并实时显示
2016/11/30 Javascript
简单谈谈Javascript函数中的arguments
2017/02/09 Javascript
无法获取隐藏元素宽度和高度的解决方案
2017/03/07 Javascript
js实现字符全排列算法的简单方法
2017/05/01 Javascript
vue之数据交互实例代码
2017/06/20 Javascript
javascript自定义日期比较函数用法示例
2019/07/22 Javascript
Vue 3.0 前瞻Vue Function API新特性体验
2019/08/12 Javascript
重置Redux的状态数据的方法实现
2019/11/18 Javascript
解决vue项目本地启动时无法携带cookie的问题
2021/02/06 Vue.js
[01:13:17]Secret vs NB 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python实现批量读取word中表格信息的方法
2015/07/30 Python
Python实现针对含中文字符串的截取功能示例
2017/09/22 Python
python logging重复记录日志问题的解决方法
2018/07/12 Python
python 计算两个列表的相关系数的实现
2019/08/29 Python
python随机模块random使用方法详解
2020/02/14 Python
Python读取excel文件中带公式的值的实现
2020/04/17 Python
Python自动发送和收取邮件的方法
2020/08/12 Python
Django-Scrapy生成后端json接口的方法示例
2020/10/06 Python
使用CSS3实现SVG路径描边动画效果入门教程
2019/10/21 HTML / CSS
HTML5之SVG 2D入门12—SVG DOM及DOM操作介绍
2013/01/30 HTML / CSS
俄罗斯大型在线书店:Читай-город
2019/10/10 全球购物
工业设计专业推荐信
2013/10/29 职场文书
自强之星事迹材料
2014/05/12 职场文书
社区学习党的群众路线教育实践活动心得体会
2014/11/03 职场文书
用position:sticky完美解决小程序吸顶问题的实现方法
2021/04/24 HTML / CSS
Go中的条件语句Switch示例详解
2021/08/23 Golang
超越Nginx的Web服务器caddy优雅用法
2022/06/21 Servers