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中执行shell的两种方法总结
Jan 10 Python
python生成tensorflow输入输出的图像格式的方法
Feb 12 Python
详解python之协程gevent模块
Jun 14 Python
Python3中详解fabfile的编写
Jun 24 Python
python库lxml在linux和WIN系统下的安装
Jun 24 Python
python批量处理文件或文件夹
Jul 28 Python
pygame实现俄罗斯方块游戏(AI篇2)
Oct 29 Python
使用Python给头像加上圣诞帽或圣诞老人小图标附源码
Dec 25 Python
Django admin管理工具TabularInline类用法详解
May 14 Python
Python脚本破解压缩文件口令实例教程(zipfile)
Jun 14 Python
tensorflow图像裁剪进行数据增强操作
Jun 30 Python
python递归函数用法详解
Oct 26 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
杏林同学录(一)
2006/10/09 PHP
php Undefined index的问题
2009/06/01 PHP
PHP curl 并发最佳实践代码分享
2012/09/05 PHP
解析php中如何直接执行SHELL
2013/06/28 PHP
详解PHP中instanceof关键字及instanceof关键字有什么作用
2015/11/05 PHP
javascript在IE下trim函数无法使用的解决方法
2014/09/12 Javascript
Javascript中For In语句用法实例
2015/05/14 Javascript
用javascript实现自动输出网页文本
2015/07/30 Javascript
jQuery实现网页顶部固定导航效果代码
2015/12/24 Javascript
JS针对浏览器窗口关闭事件的监听方法集锦
2016/06/24 Javascript
基于JS实现移动端向左滑动出现删除按钮功能
2017/02/22 Javascript
使用html+js+css 实现页面轮播图效果(实例讲解)
2017/09/21 Javascript
Vue调试神器vue-devtools安装方法
2017/12/12 Javascript
jquery实现弹窗(系统提示框)效果
2019/12/10 jQuery
京东优选小程序的实现代码示例
2020/02/25 Javascript
js数组中去除重复值的几种方法
2020/08/03 Javascript
[00:37]DOTA2上海特级锦标赛 Secert 战队宣传片
2016/03/03 DOTA
Python中str.format()详解
2017/03/12 Python
Python分析学校四六级过关情况
2017/11/22 Python
java判断三位数的实例讲解
2019/06/10 Python
python字符串格式化方式解析
2019/10/19 Python
Python实现链表反转的方法分析【迭代法与递归法】
2020/02/22 Python
matlab中二维插值函数interp2的使用详解
2020/04/22 Python
Python捕获异常堆栈信息的几种方法(小结)
2020/05/18 Python
详解用Python调用百度地图正/逆地理编码API
2020/07/02 Python
浅谈pandas dataframe对除数是零的处理
2020/07/20 Python
pycharm最新激活码有效期至2100年(亲测可用)
2021/02/05 Python
《影子》教学反思
2014/02/21 职场文书
竞选演讲稿范文大全
2014/05/12 职场文书
村支部书记群众路线对照检查材料思想汇报
2014/10/08 职场文书
2015年组织部工作总结
2015/04/03 职场文书
运动会宣传语
2015/07/13 职场文书
信息简报范文
2015/07/21 职场文书
MySQL 自定义变量的概念及特点
2021/05/13 MySQL
Python打包为exe详细教程
2021/05/18 Python
原生JavaScript实现简单五子棋游戏
2021/06/28 Javascript