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 相关文章推荐
python3抓取中文网页的方法
Jul 28 Python
Python使用QRCode模块生成二维码实例详解
Jun 14 Python
在java中如何定义一个抽象属性示例详解
Aug 18 Python
使用C++扩展Python的功能详解
Jan 12 Python
python+selenium实现QQ邮箱自动发送功能
Jan 23 Python
对django中foreignkey的简单使用详解
Jul 28 Python
python 图片二值化处理(处理后为纯黑白的图片)
Nov 01 Python
python统计函数库scipy.stats的用法解析
Feb 25 Python
Jupyter notebook 启动闪退问题的解决
Apr 13 Python
python 代码运行时间获取方式详解
Sep 18 Python
Pytest测试框架基本使用方法详解
Nov 25 Python
Python字符串常规操作小结
Apr 03 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
用PHPdig打造属于你自己的Google[图文教程]
2007/02/14 PHP
PHP获取中英混合字符串长度的方法
2014/06/07 PHP
Destoon旺旺无法正常显示,点击提示“会员名不存在”的解决办法
2014/06/21 PHP
JQuery toggle使用分析
2009/11/16 Javascript
jQuery开发者都需要知道的5个小技巧
2010/01/08 Javascript
javascript 跨浏览器开发经验总结(五) js 事件
2010/05/19 Javascript
jquery 跨域访问问题解决方法(笔记)
2011/06/08 Javascript
Javascript基础知识(三)BOM,DOM总结
2014/09/29 Javascript
javascript常用代码段搜集
2014/12/04 Javascript
js实现双击图片放大单击缩小的方法
2015/02/17 Javascript
JS限制文本框只能输入数字和字母方法
2015/02/28 Javascript
在JavaScript中处理字符串之link()方法的使用
2015/06/08 Javascript
JS使用cookie设置样式的方法
2016/06/30 Javascript
关于Vue.js一些问题和思考学习笔记(2)
2016/12/02 Javascript
vue动态组件实现选项卡切换效果
2017/03/08 Javascript
微信小程序 合法域名校验出错详解及解决办法
2017/03/09 Javascript
vue内置组件transition简单原理图文详解(小结)
2018/07/12 Javascript
详解利用eventemitter2实现Vue组件通信
2019/11/04 Javascript
纯js+css实现仿移动端淘宝网站的弹出详情框功能
2019/12/29 Javascript
使用Karma做vue组件单元测试的实现
2020/01/16 Javascript
python+django+sql学生信息管理后台开发
2018/01/11 Python
python 使用正则表达式按照多个空格分割字符的实例
2018/12/20 Python
python中下标和切片的使用方法解析
2019/08/27 Python
TensorFlow 读取CSV数据的实例
2020/02/05 Python
Python如何使用OS模块调用cmd
2020/02/27 Python
Ted Baker英国官网:男士和女士服装及配件
2017/03/13 全球购物
财务负责人任命书
2014/06/06 职场文书
法制演讲稿
2014/09/10 职场文书
解放思想演讲稿
2014/09/11 职场文书
爱牙日宣传活动总结
2015/02/05 职场文书
开票员岗位职责
2015/02/12 职场文书
会计岗位职责范本
2015/04/02 职场文书
Python实现智慧校园自动评教全新版
2021/06/18 Python
Python函数式编程中itertools模块详解
2021/09/15 Python
MySQL如何快速创建800w条测试数据表
2022/03/17 MySQL
vue el-table实现递归嵌套的示例代码
2022/08/14 Vue.js