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实现扫描指定目录下的子目录及文件的方法
Jul 16 Python
Python使用正则匹配实现抓图代码分享
Apr 02 Python
python中base64加密解密方法实例分析
May 16 Python
python查找指定具有相同内容文件的方法
Jun 28 Python
Python学习小技巧之列表项的推导式与过滤操作
May 20 Python
Python实现KNN邻近算法
Jan 28 Python
pytorch permute维度转换方法
Dec 14 Python
PyQt5实现QLineEdit添加clicked信号的方法
Jun 25 Python
python正则-re的用法详解
Jul 28 Python
使用Python实现图像标记点的坐标输出功能
Aug 14 Python
python+Selenium自动化测试——输入,点击操作
Mar 06 Python
python爬虫要用到的库总结
Jul 28 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版(1)
2006/10/09 PHP
ThinkPHP模板IF标签用法详解
2014/07/01 PHP
php接口数据加密、解密、验证签名
2015/03/12 PHP
WordPress中查询文章的循环Loop结构及用法分析
2015/12/17 PHP
PHP基于SPL实现的迭代器模式示例
2018/04/22 PHP
laravel 获取某个查询的查询SQL语句方法
2019/10/12 PHP
JavaScript Archive Network 集合
2007/05/12 Javascript
List Information About the Binary Files Used by an Application
2007/06/11 Javascript
前端开发部分总结[兼容性、DOM操作、跨域等](持续更新)
2010/03/04 Javascript
jquery multiSelect 多选下拉框
2010/07/09 Javascript
文字溢出实现溢出的部分再放入一个新生成的div中具体代码
2013/05/17 Javascript
javascript制作的cookie封装及使用指南
2015/01/02 Javascript
javascript实现鼠标点击页面 移动DIV
2016/12/02 Javascript
jQuery实现动画、消失、显现、渐出、渐入效果示例
2018/09/06 jQuery
vue-cli3 karma单元测试的实现
2019/01/18 Javascript
微信小程序抽奖组件的使用步骤
2021/01/11 Javascript
python mysqldb连接数据库
2009/03/16 Python
python+splinter自动刷新抢票功能
2018/09/25 Python
Django组件之cookie与session的使用方法
2019/01/10 Python
运用Python的webbrowser实现定时打开特定网页
2019/02/21 Python
Python自动生成代码 使用tkinter图形化操作并生成代码框架
2019/09/18 Python
python实现双色球随机选号
2020/01/01 Python
Python tkinter三种布局实例详解
2020/01/06 Python
教你如何用python操作摄像头以及对视频流的处理
2020/10/12 Python
前端隐藏出边界内容的实现方法
2016/04/14 HTML / CSS
Sunglasses Shop瑞典:欧洲领先的太阳镜网上商店
2018/04/22 全球购物
Perfume’s Club英国官网:购买香水和护肤品
2019/11/02 全球购物
装修设计师求职信
2014/02/26 职场文书
项目经理任命书
2014/06/04 职场文书
淘宝店策划方案
2014/06/07 职场文书
信仰心得体会
2014/09/05 职场文书
关于清明节的演讲稿
2014/09/13 职场文书
2014年师德师风工作总结
2014/11/25 职场文书
校长一岗双责责任书
2015/05/09 职场文书
标准版个人借条怎么写?以及什么是借条?
2019/08/28 职场文书
springBoot基于webSocket实现扫码登录
2021/06/22 Java/Android