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中的自定义函数学习笔记
Sep 23 Python
Python编程中的反模式实例分析
Dec 08 Python
介绍Python中的一些高级编程技巧
Apr 02 Python
Python 'takes exactly 1 argument (2 given)' Python error
Dec 13 Python
python基础教程之while循环
Aug 14 Python
在python中做正态性检验示例
Dec 09 Python
Python实现序列化及csv文件读取
Jan 19 Python
使用python自动追踪你的快递(物流推送邮箱)
Mar 17 Python
如何在Python 游戏中模拟引力
Mar 27 Python
解决keras加入lambda层时shape的问题
Jun 11 Python
python pip如何手动安装二进制包
Sep 30 Python
Python-typing: 类型标注与支持 Any类型详解
May 10 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
给初学PHP的5个入手程序
2006/11/23 PHP
php中cookie的作用域
2008/03/27 PHP
PHP 翻页 实例代码
2009/08/07 PHP
Ha0k 0.3 PHP 网页木马修改版
2009/10/11 PHP
php截取字符串函数substr,iconv_substr,mb_substr示例以及优劣分析
2014/06/10 PHP
php实现给二维数组中所有一维数组添加值的方法
2017/02/04 PHP
微信支付之JSAPI公众号支付详解
2019/05/15 PHP
PHP生成zip压缩包的常用方法示例
2019/08/22 PHP
解决laravel5中auth用户登录其他页面获取不到登录信息的问题
2019/10/08 PHP
深入理解JavaScript系列(39):设计模式之适配器模式详解
2015/03/04 Javascript
javascript通过获取html标签属性class实现多选项卡的方法
2015/07/27 Javascript
基于jquery实现的树形菜单效果代码
2015/09/06 Javascript
使用PHP+JavaScript将HTML页面转换为图片的实例分享
2016/04/18 Javascript
vueJS简单的点击显示与隐藏的效果【实现代码】
2016/05/03 Javascript
JS正则表达式验证密码格式的集中情况总结
2017/02/23 Javascript
Angular使用过滤器uppercase/lowercase实现字母大小写转换功能示例
2018/03/27 Javascript
Javascript实现贪吃蛇小游戏(含详细注释)
2020/10/23 Javascript
vue实现下载文件流完整前后端代码
2020/11/17 Vue.js
[03:28]2014DOTA2国际邀请赛 走近EG战队天才中单Arteezy
2014/07/12 DOTA
[06:15]2016国际邀请赛中国区预选赛单车采访:我顶WINGS
2016/06/27 DOTA
Python中的列表知识点汇总
2015/04/14 Python
实践Python的爬虫框架Scrapy来抓取豆瓣电影TOP250
2016/01/20 Python
Python 通配符删除文件的实例
2018/04/24 Python
Python2实现的图片文本识别功能详解
2018/07/11 Python
学生信息管理系统Python面向对象版
2019/01/30 Python
Python3搭建http服务器的实现代码
2020/02/11 Python
Python识别html主要文本框过程解析
2020/02/18 Python
基于python 凸包问题的解决
2020/04/16 Python
在 Python 中使用 MQTT的方法
2020/08/18 Python
详解python 条件语句和while循环的实例代码
2020/12/28 Python
python利用opencv实现颜色检测
2021/02/23 Python
草莓网官网:StrawberryNET
2019/08/21 全球购物
拉拉队口号
2014/06/16 职场文书
党员身份证明材料
2015/06/19 职场文书
Nginx+Windows搭建域名访问环境的操作方法
2022/03/17 Servers
python使用pycharm安装pyqt5以及相关配置
2022/04/22 Python