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 实现归并排序算法
Jun 05 Python
Python中super关键字用法实例分析
May 28 Python
python3写爬取B站视频弹幕功能
Dec 22 Python
Python使用装饰器进行django开发实例代码
Feb 06 Python
Python lambda函数基本用法实例分析
Mar 16 Python
python读取txt文件,去掉空格计算每行长度的方法
Dec 20 Python
pandas 数据索引与选取的实现方法
Jun 21 Python
Python序列对象与String类型内置方法详解
Oct 22 Python
Python通过递归函数输出嵌套列表元素
Oct 15 Python
用python查找统一局域网下ip对应的mac地址
Jan 13 Python
python中time包实例详解
Feb 02 Python
Python实现双向链表基本操作
May 25 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
PHP4引用文件语句的对比
2006/10/09 PHP
BBS(php &amp; mysql)完整版(七)
2006/10/09 PHP
第二章 PHP入门基础之php代码写法
2011/12/30 PHP
PHP获取指定时间段之间的 年,月,天,时,分,秒
2016/06/05 PHP
PHP实现的文件上传类与用法详解
2017/07/05 PHP
PHP7新特性
2021/03/09 PHP
常用一些Javascript判断函数
2012/08/14 Javascript
扩展JS Date对象时间格式化功能的小例子
2013/12/02 Javascript
jquery实现页面虚拟键盘特效
2015/08/08 Javascript
学习vue.js表单控件绑定操作
2016/12/05 Javascript
IE11下使用canvas.toDataURL报SecurityError错误的解决方法
2017/11/19 Javascript
微信小程序如何实现在线客服功能
2019/10/16 Javascript
vue中实现点击按钮滚动到页面对应位置的方法(使用c3平滑属性实现)
2019/12/29 Javascript
JS面向对象之单选框实现
2020/01/17 Javascript
jQuery实现B2B网站后台管理系统侧导航
2020/07/08 jQuery
python实现模拟按键,自动翻页看u17漫画
2015/03/17 Python
Python如何读取MySQL数据库表数据
2017/03/11 Python
对python while循环和双重循环的实例详解
2019/08/23 Python
Django+uni-app实现数据通信中的请求跨域的示例代码
2019/10/12 Python
详解CSS3中强大的filter(滤镜)属性
2017/06/29 HTML / CSS
全天然狗零食:Best Bully Sticks
2016/09/22 全球购物
ALDO加拿大官网:加拿大女鞋品牌
2018/12/22 全球购物
激光脱毛、蓝光和护肤:Tria Beauty
2019/03/28 全球购物
英国婚礼商城:Wedding Mall
2019/11/02 全球购物
Whistles官网:英国女装品牌
2020/08/14 全球购物
什么是Deployment descriptors;都有什么类型的部署描述符
2015/07/28 面试题
物业管理应届生求职信
2013/10/28 职场文书
大学生军训自我鉴定
2014/02/12 职场文书
人力资源作业细则
2014/03/03 职场文书
小学教师寄语大全
2014/04/03 职场文书
初中新生军训方案
2014/05/13 职场文书
行政专员岗位职责说明书
2014/09/01 职场文书
房屋租赁合同补充协议
2014/10/11 职场文书
二手车转让协议书
2015/01/29 职场文书
英语专业毕业论文答辩开场白
2015/05/27 职场文书
导游词之青城山景区
2019/09/27 职场文书