1. 程式人生 > 程式設計 >python開發例項之python使用Websocket庫開發簡單聊天工具例項詳解(python+Websocket+JS)

python開發例項之python使用Websocket庫開發簡單聊天工具例項詳解(python+Websocket+JS)

最近又回顧了下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庫開發知識請檢視下面的相關連結