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爬取Coursera课程资源的详细过程
Nov 04 Python
Python中类型检查的详细介绍
Feb 13 Python
Python调用微信公众平台接口操作示例
Jul 08 Python
Python探索之静态方法和类方法的区别详解
Oct 27 Python
python thrift搭建服务端和客户端测试程序
Jan 17 Python
django如何连接已存在数据的数据库
Aug 14 Python
Python 一键制作微信好友图片墙的方法
May 16 Python
python卸载后再次安装遇到的问题解决
Jul 10 Python
Python实现Singleton模式的方式详解
Aug 08 Python
解决Python3用PIL的ImageFont输出中文乱码的问题
Aug 22 Python
PyCharm 安装与使用配置教程(windows,mac通用)
May 12 Python
Python合并多张图片成PDF
Jun 09 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
1982年日本摄影师镜头下的中国孩子 那无忧无虑的童年
2020/03/12 杂记
DIY实用性框形天线
2021/03/02 无线电
实例(Smarty+FCKeditor新闻系统)
2007/01/02 PHP
php设计模式之简单工厂模式详解
2014/09/04 PHP
PHP面向对象类型约束用法分析
2019/06/12 PHP
showModalDialog在谷歌浏览器下会返回Null的解决方法
2013/11/27 Javascript
window.location.href中url中数据量太大时的解决方法
2013/12/23 Javascript
8个超实用的jQuery功能代码分享
2015/01/08 Javascript
jQuery中slideUp 和 slideDown 的点击事件
2015/02/26 Javascript
JavaScript数组去重的3种方法和代码实例
2015/07/01 Javascript
浅析javascript异步执行函数导致的变量变化问题解决思路
2016/05/13 Javascript
vue组件实例解析
2017/01/10 Javascript
js cookie实现记住密码功能
2017/01/17 Javascript
微信小程序 实例开发总结
2017/04/26 Javascript
浅谈vue项目打包优化策略
2018/09/29 Javascript
详解JavaScript 的变量
2019/03/08 Javascript
详解VScode编辑器vue环境搭建所遇问题解决方案
2019/04/26 Javascript
[01:03]PWL开团时刻DAY6——别打我
2020/11/05 DOTA
Python实现简单多线程任务队列
2016/02/27 Python
Python中动态检测编码chardet的使用教程
2017/07/06 Python
Python中对数组集进行按行打乱shuffle的方法
2018/11/08 Python
python利用itertools生成密码字典并多线程撞库破解rar密码
2019/08/12 Python
使用TensorFlow直接获取处理MNIST数据方式
2020/02/10 Python
python接口自动化之ConfigParser配置文件的使用详解
2020/08/03 Python
常用的HTML5列表标签
2017/06/20 HTML / CSS
Canvas在超级玛丽游戏中的应用详解
2021/02/06 HTML / CSS
Get The Label中文官网:英国运动时尚购物平台
2017/04/19 全球购物
英国信箱在线鲜花速递公司:Bloom & Wild
2019/03/10 全球购物
真正的英国宝藏:Mappin & Webb
2019/05/05 全球购物
Kate Spade澳大利亚官方网站:美国设计师手袋品牌
2019/09/10 全球购物
C#笔试题和英文面试题
2013/02/07 面试题
寒暑假实习证明书模板
2014/11/29 职场文书
农民工工资支付承诺书
2015/05/04 职场文书
2016年校园重阳节广播稿
2015/12/18 职场文书
《别在吃苦的年纪选择安逸》读后感3篇
2019/11/30 职场文书
Python常用配置文件ini、json、yaml读写总结
2021/07/09 Python