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 相关文章推荐
利用Fn.py库在Python中进行函数式编程
Apr 22 Python
详解python发送各类邮件的主要方法
Dec 22 Python
Python正则表达式实现截取成对括号的方法
Jan 06 Python
pygame 精灵的行走及二段跳的实现方法(必看篇)
Jul 10 Python
用Eclipse写python程序
Feb 10 Python
Python入门必须知道的11个知识点
Mar 21 Python
Python使用sorted对字典的key或value排序
Nov 15 Python
使用Python快速制作可视化报表的方法
Feb 03 Python
matlab灰度图像调整及imadjust函数的用法详解
Feb 27 Python
python线程池如何使用
May 28 Python
DRF使用simple JWT身份验证的实现
Jan 14 Python
Python操作Excel的学习笔记
Feb 18 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
解析使用substr截取UTF-8中文字符串出现乱码的问题
2013/06/20 PHP
PHP 输出URL的快捷方式示例代码
2013/09/22 PHP
PHP缓存机制Output Control详解
2014/07/14 PHP
php计算到指定日期还有多少天的方法
2015/04/14 PHP
JS(jQuery)实现聊天接收到消息语言自动提醒功能详解【提示“您有新的消息请注意查收”】
2019/04/16 PHP
dojo 之基础篇
2007/03/24 Javascript
两个DIV等高的JS的实现代码
2007/12/23 Javascript
按钮JS复制文本框和表格的代码
2011/04/01 Javascript
JS 添加千分位与去掉千分位的示例
2013/07/11 Javascript
js获取电脑分辨率的思路及操作
2013/11/22 Javascript
javascript放大镜效果的简单实现
2013/12/09 Javascript
JavaScript闭包实例讲解
2014/04/22 Javascript
显示今天的日期js代码(阳历和农历)
2014/09/30 Javascript
详谈JavaScript 匿名函数及闭包
2014/11/14 Javascript
JavaScript Length 属性的总结
2015/11/02 Javascript
angular.js分页代码的实例
2016/07/27 Javascript
Node.js中文件操作模块File System的详细介绍
2017/01/05 Javascript
微信小程序访问node.js接口服务器搭建教程
2017/04/25 Javascript
Vue.js中轻松解决v-for执行出错的三个方案
2017/06/09 Javascript
jQuery 实现鼠标画框并对框内数据选中的实例代码
2017/08/29 jQuery
JavaScript实现小球沿正弦曲线运动
2020/09/07 Javascript
浅谈js中的bind
2019/03/18 Javascript
layui button 按钮弹出提示窗口,确定才进行的方法
2019/09/06 Javascript
[08:04]TI4西雅图DOTA2前线报道 海涛探访各路人马
2014/07/09 DOTA
Mac OS X10.9安装的Python2.7升级Python3.3步骤详解
2013/12/04 Python
python脚本设置系统时间的两种方法
2016/02/21 Python
Python中输入和输出(打印)数据实例方法
2019/10/13 Python
解决Tensorboard可视化错误:不显示数据 No scalar data was found
2020/02/15 Python
python GUI库图形界面开发之PyQt5状态栏控件QStatusBar详细使用方法实例
2020/02/28 Python
python 密码学示例——理解哈希(Hash)算法
2020/09/21 Python
介绍一下JMS编程步骤
2015/09/22 面试题
基层干部群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
2014村书记党建工作汇报材料
2014/11/02 职场文书
绵山导游词
2015/02/05 职场文书
《雷雨》教学反思
2016/02/20 职场文书
MySQL 百万级数据的4种查询优化方式
2021/06/07 MySQL