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的Flask框架中生成SECRET_KEY密钥的方法
Jun 07 Python
python字符串,数值计算
Oct 05 Python
Python3 伪装浏览器的方法示例
Nov 23 Python
django模板语法学习之include示例详解
Dec 17 Python
TensorFlow实现卷积神经网络CNN
Mar 09 Python
在IPython中进行Python程序执行时间的测量方法
Nov 01 Python
Python中一个for循环循环多个变量的示例
Jul 16 Python
详解pycharm连接不上mysql数据库的解决办法
Jan 10 Python
详解python常用命令行选项与环境变量
Feb 20 Python
详解pandas中利用DataFrame对象的.loc[]、.iloc[]方法抽取数据
Dec 13 Python
python爬虫线程池案例详解(梨视频短视频爬取)
Feb 20 Python
Sentry的安装、配置、使用教程(Sentry日志手机系统)
Jul 23 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下使用以下代码连接并测试
2008/04/09 PHP
php实现按文件名搜索文件的远程文件查找器
2014/05/10 PHP
PHP中ini_set与ini_get用法实例
2014/11/04 PHP
超级退弹代码
2008/07/07 Javascript
jquery获取特定name所有选中的checkbox,支持IE9标准模式
2013/03/18 Javascript
Javascript中的delete操作符详细介绍
2014/06/06 Javascript
node.js中的events.emitter.removeListener方法使用说明
2014/12/10 Javascript
javascript实现简单的二级联动
2015/03/19 Javascript
JSON与XML优缺点对比分析
2015/07/17 Javascript
郁闷!ionic中获取ng-model绑定的值为undefined如何解决
2016/08/27 Javascript
javascript 判断页面访问方式电脑或者移动端
2016/09/19 Javascript
js实现音乐播放控制条
2017/09/09 Javascript
简单了解node npm cnpm的具体使用方法
2019/02/27 Javascript
layer插件实现在弹出层中弹出一警告提示并关闭弹出层的方法
2019/09/24 Javascript
JS轮播图的实现方法2
2020/08/25 Javascript
vue 封装面包屑组件教程
2020/11/16 Javascript
[16:19]教你分分钟做大人——风暴之灵
2015/03/11 DOTA
python3的输入方式及多组输入方法
2018/10/17 Python
使用python获取电脑的磁盘信息方法
2018/11/01 Python
浅谈python写入大量文件的问题
2018/11/09 Python
python获取地震信息 微信实时推送
2019/06/18 Python
梅尔倒谱系数(MFCC)实现
2019/06/19 Python
python 实现的发送邮件模板【普通邮件、带附件、带图片邮件】
2019/07/06 Python
python的mysql数据库建立表与插入数据操作示例
2019/09/30 Python
浅谈css3新单位vw、vh、vmin、vmax的使用详解
2017/12/01 HTML / CSS
幼儿园秋游活动方案
2014/01/21 职场文书
甜点店创业计划书
2014/01/27 职场文书
初一体育教学反思
2014/01/29 职场文书
周年庆促销方案
2014/03/15 职场文书
2014领导班子正风肃纪思想汇报
2014/09/18 职场文书
三严三实对照检查材料范文
2014/09/23 职场文书
群众路线教育实践活动学习心得体会
2014/10/30 职场文书
医护人员继续教育学习心得体会
2016/01/19 职场文书
Vue + iView实现Excel上传功能的完整代码
2021/06/22 Vue.js
SQLServer中JSON文档型数据的查询问题解决
2021/06/27 SQL Server
MySQL 分区表中分区键为什么必须是主键的一部分
2022/03/17 MySQL