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实现同时兼容老版和新版Socket协议的一个简单WebSocket服务器
Jun 04 Python
Windows系统下安装Python的SSH模块教程
Feb 05 Python
在Python中使用cookielib和urllib2配合PyQuery抓取网页信息
Apr 25 Python
Python实现一个Git日志统计分析的小工具
Dec 14 Python
Python cookbook(数据结构与算法)从字典中提取子集的方法示例
Mar 22 Python
python 自动去除空行的实例
Jul 24 Python
Python正则表达式匹配日期与时间的方法
Jul 07 Python
在Mac中PyCharm配置python Anaconda环境过程图解
Mar 11 Python
Python3爬虫里关于Splash负载均衡配置详解
Jul 10 Python
用python给csv里的数据排序的具体代码
Jul 17 Python
用Python写一个简易版弹球游戏
Apr 13 Python
Python使用MapReduce进行简单的销售统计
Apr 22 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中的strtr函数使用介绍(str_replace)
2011/10/20 PHP
php面向对象 字段的声明与使用
2012/06/14 PHP
基于php设计模式中单例模式的应用分析
2013/05/15 PHP
PHP实现批量生成App各种尺寸Logo
2015/03/19 PHP
PHP借助phpmailer发送邮件
2015/05/11 PHP
twig模板常用语句实例小结
2016/02/04 PHP
thinkphp3.2实现在线留言提交验证码功能
2017/07/19 PHP
一直复略了的一个问题,关于表单重复提交
2007/02/15 Javascript
Js 随机数产生6位数字
2010/05/13 Javascript
循环 vs 递归浅谈
2013/02/28 Javascript
构造函数+原型模式构造js自定义对象(最通用)
2014/05/12 Javascript
比例尺、缩略图、平移缩放之百度地图添加控件方法
2015/08/03 Javascript
深入解析桶排序算法及Node.js上JavaScript的代码实现
2016/07/06 Javascript
JS中正则表达式只有3种匹配模式(没有单行模式)详解
2016/07/28 Javascript
Javascript中判断一个值是否为undefined的方法详解
2016/09/28 Javascript
Vue结合Video.js播放m3u8视频流的方法示例
2018/05/04 Javascript
vue项目实现表单登录页保存账号和密码到cookie功能
2018/08/31 Javascript
JS实现textarea通过换行或者回车把多行数字分割成数组并且去掉数组中空的值
2018/10/29 Javascript
vue项目前端知识点整理【收藏】
2019/05/13 Javascript
通过layer实现可输入的模态框的例子
2019/09/27 Javascript
python 中文乱码问题深入分析
2011/03/13 Python
在Python的Django框架中更新数据库数据的方法
2015/07/17 Python
Python多线程爬虫实战_爬取糗事百科段子的实例
2017/12/15 Python
python负载均衡的简单实现方法
2018/02/04 Python
运用TensorFlow进行简单实现线性回归、梯度下降示例
2018/03/05 Python
使用python Fabric动态修改远程机器hosts的方法
2018/10/26 Python
python的依赖管理的实现
2019/05/14 Python
python3射线法判断点是否在多边形内
2019/06/28 Python
python词云库wordCloud使用方法详解(解决中文乱码)
2020/02/17 Python
python GUI库图形界面开发之PyQt5单行文本框控件QLineEdit详细使用方法与实例
2020/02/27 Python
SVG实现多彩圆环倒计时效果的示例代码
2017/11/21 HTML / CSS
美国单身专业人士在线约会网站:EliteSingles
2019/03/19 全球购物
瑞典网上购买现代和复古家具:Reforma
2019/10/21 全球购物
小学捐书活动总结
2014/07/05 职场文书
公司授权委托书格式样本
2014/10/01 职场文书
办护照工作证明
2014/10/01 职场文书