python开发实例之python使用Websocket库开发简单聊天工具实例详解(python+Websocket+JS)


Posted in Python onMarch 18, 2020

最近又回顾了下Websocket,发现已经忘的七七八八了。于是用js写了客户端,用python写了服务端,来复习一下这方面的知识。

先看一下python简单聊天工具最终效果

一个客户端连上服务的并发送消息

python开发实例之python使用Websocket库开发简单聊天工具实例详解(python+Websocket+JS)

另一个客户端连上服务的并发送消息

python开发实例之python使用Websocket库开发简单聊天工具实例详解(python+Websocket+JS)

服务的收到客户端的全部消息并返回消息

python开发实例之python使用Websocket库开发简单聊天工具实例详解(python+Websocket+JS)

一个客户端掉线并不影响其它socket连接

python开发实例之python使用Websocket库开发简单聊天工具实例详解(python+Websocket+JS)

列取全部连接客户端对象和当前发消息的客户端对象

python开发实例之python使用Websocket库开发简单聊天工具实例详解(python+Websocket+JS)

先安装websockets

pip install websockets

python简单聊天工具实例源码

Python聊天工具服务端

#! -*- coding: utf-8 -*-
"""
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()

python简单聊天工具客户端代码Html+Js

<!-- Websocket 的使用示例 -->
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>测试Socket——ws://127.0.0.1:8181</title>
  <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>
</head>
<body>
  <textarea rows="3" cols="30" id="showMes" style="width:300px;height:500px;"></textarea>
  <br/>
  <label>名称</label>
  <input type="text" id="name"/>
  <br/>
  <label>消息</label>
  <input type="text" id="mes"/>
  <button onclick="sendMeg();">发送</button>
</body>
</html>

本文主要介绍了python使用Websocket库开发简单聊天工具实例详细,更多关于python Websocket库开发知识请查看下面的相关链接

Python 相关文章推荐
Python Tkinter简单布局实例教程
Sep 03 Python
python获取本机外网ip的方法
Apr 15 Python
Python使用爬虫猜密码
Feb 19 Python
Python实现学生成绩管理系统
Apr 05 Python
python批量复制图片到另一个文件夹
Sep 17 Python
对python多线程SSH登录并发脚本详解
Feb 14 Python
对python特殊函数 __call__()的使用详解
Jul 02 Python
Python SELENIUM上传文件或图片实现过程
Oct 28 Python
Python实现RGB与HSI颜色空间的互换方式
Nov 27 Python
Python 读取xml数据,cv2裁剪图片实例
Mar 10 Python
解决jupyter notebook打不开无反应 浏览器未启动的问题
Apr 10 Python
Python爬虫如何破解JS加密的Cookie
Nov 19 Python
python selenium操作cookie的实现
Mar 18 #Python
Selenium 滚动页面至元素可见的方法
Mar 18 #Python
python字符串判断密码强弱
Mar 18 #Python
详解Python3中的 input() 函数
Mar 18 #Python
Python通过socketserver处理多个链接
Mar 18 #Python
python实现密码强度校验
Mar 18 #Python
Python tcp传输代码实例解析
Mar 18 #Python
You might like
我常用的几个类
2006/10/09 PHP
php检测用户是否用手机(Mobile)访问网站的类
2014/01/09 PHP
推荐一款PHP+jQuery制作的列表分页的功能模块
2014/10/14 PHP
thinkphp项目部署到Linux服务器上报错“模板不存在”如何解决
2016/04/27 PHP
PHP实现的最大正向匹配算法示例
2017/12/19 PHP
jQuery使用prepend()方法在元素前添加内容用法实例
2015/03/26 Javascript
JavaScript图像延迟加载库Echo.js
2016/04/05 Javascript
angularJs的ng-class切换class
2017/06/23 Javascript
vue webpack打包后图片路径错误的完美解决方法
2018/12/07 Javascript
推荐一个基于Node.js的表单验证库
2019/02/15 Javascript
JavaScript交换变量的常用方法小结【4种方法】
2020/05/07 Javascript
python之PyMongo使用总结
2017/05/26 Python
解决Python字典写入文件出行首行有空格的问题
2017/09/27 Python
python将每个单词按空格分开并保存到文件中
2018/03/19 Python
python 对txt中每行内容进行批量替换的方法
2018/07/11 Python
Python2和Python3.6环境解决共存问题
2018/11/09 Python
python中时间模块的基本使用教程
2019/05/14 Python
浅谈python多进程共享变量Value的使用tips
2019/07/16 Python
Keras SGD 随机梯度下降优化器参数设置方式
2020/06/19 Python
VSCode中autopep8无法运行问题解决方案(提示Error: Command failed,usage)
2021/03/02 Python
ZINVO手表官网:男士和女士手表
2019/03/10 全球购物
德国网上超市:myTime.de
2019/08/26 全球购物
C#软件工程师英语面试题
2015/06/07 面试题
用Python匹配HTML tag的时候,<.*>和<.*?>有什么区别
2012/11/04 面试题
工程造价自荐信
2013/10/09 职场文书
求职意向书
2014/07/29 职场文书
乡镇党委书记个人整改措施
2014/09/15 职场文书
2014学习十八届四中全会精神思想汇报范文
2014/10/23 职场文书
2014年宣传工作总结
2014/11/18 职场文书
2014年检验员工作总结
2014/11/19 职场文书
2014年英语教学工作总结
2014/12/17 职场文书
监察建议书
2015/02/04 职场文书
郭明义电影观后感
2015/06/08 职场文书
nginx 防盗链防爬虫配置详解
2021/03/31 Servers
教你怎么用Python实现GIF动图的提取及合成
2021/06/15 Python
一定要知道的 25 个 Vue 技巧
2021/11/02 Vue.js