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使用正则表达式分析网页中的图片并进行替换的方法
Mar 26 Python
Python实现霍夫圆和椭圆变换代码详解
Jan 12 Python
python实现树形打印目录结构
Mar 29 Python
浅谈Pycharm中的Python Console与Terminal
Jan 17 Python
解决Python selenium get页面很慢时的问题
Jan 30 Python
对python 多线程中的守护线程与join的用法详解
Feb 18 Python
新手入门Python编程的8个实用建议
Jul 12 Python
Django项目使用CircleCI的方法示例
Jul 14 Python
Django RBAC权限管理设计过程详解
Aug 06 Python
使用Pyhton 分析酒店针孔摄像头
Mar 04 Python
Python中BeautifulSoup通过查找Id获取元素信息
Dec 07 Python
Django框架中视图的用法
Jun 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
discuz论坛 用户登录 后台程序代码
2008/11/27 PHP
PHP+shell脚本操作Memcached和Apache Status的实例分享
2016/03/11 PHP
一个简单安全的PHP验证码类、PHP验证码
2016/09/24 PHP
PHP Socket网络操作类定义与用法示例
2017/08/30 PHP
jquery HotKeys轻松搞定键盘事件代码
2008/08/30 Javascript
使用JavaScript库还是自己写代码?
2010/01/28 Javascript
javascript中方便增删改cookie的一个类
2012/10/11 Javascript
图片img的src不变让浏览器重新加载实现方法
2013/03/29 Javascript
javascript实现复选框超过限制即弹出警告框的方法
2015/02/25 Javascript
JavaScript中的this机制
2016/01/30 Javascript
PhotoSwipe异步动态加载图片方法
2016/08/25 Javascript
总结十个Angular.js由浅入深的面试问题
2016/08/26 Javascript
解析javascript图片懒加载与预加载的分析总结
2016/10/27 Javascript
利用D3.js实现最简单的柱状图示例代码
2016/12/09 Javascript
JS简单实现表格排序功能示例
2016/12/20 Javascript
JS实现瀑布流布局
2017/10/21 Javascript
JS处理数据四舍五入(tofixed与round的区别详解)
2017/10/26 Javascript
javascript自定义事件功能与用法实例分析
2017/11/08 Javascript
jackson解析json字符串,首字母大写会自动转为小写的方法
2017/12/22 Javascript
Layui 动态禁止select下拉的例子
2019/09/03 Javascript
JS继承实现方法及优缺点详解
2020/09/02 Javascript
微信小程序实现签到弹窗动画
2020/09/21 Javascript
JavaScript用document.write()输出换行的示例代码
2020/11/26 Javascript
[03:48]DOTA2完美大师赛主赛事第二日精彩集锦
2017/11/24 DOTA
[58:25]VP vs RNG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
编写Python脚本批量下载DesktopNexus壁纸的教程
2015/05/06 Python
python中使用序列的方法
2015/08/03 Python
完美解决在oj中Python的循环输入问题
2018/06/25 Python
Python3.5实现的罗马数字转换成整数功能示例
2019/02/25 Python
python的内存管理和垃圾回收机制详解
2019/05/18 Python
集体婚礼证婚词
2014/01/13 职场文书
统计系教授推荐信
2014/02/28 职场文书
教师敬业奉献模范事迹材料
2014/05/18 职场文书
考试保密承诺书
2014/08/30 职场文书
Python WSGI 规范简介
2021/04/11 Python
spring项目中切面及AOP的使用方法
2021/06/26 Java/Android