1. 程式人生 > 程式設計 >Python Websocket服務端通訊的使用示例

Python Websocket服務端通訊的使用示例

1、嘮嘮叨叨

最近又回顧了下Websocket,發現已經忘的七七八八了。於是用js寫了客戶端,用python寫了服務端,來複習一下這方面的知識。

WebSocket 是一種標準協議,用於在客戶端和服務端之間進行雙向資料傳輸。但它跟 HTTP 沒什麼關係,它是基於 TCP 的一種獨立實現。

以前客戶端想知道服務端的處理進度,要不停地使用 Ajax 進行輪詢,讓瀏覽器隔個幾秒就向伺服器發一次請求,這對伺服器壓力較大。另外一種輪詢就是採用 long poll 的方式,這就跟打電話差不多,沒收到訊息就一直不掛電話,也就是說,客戶端發起連線後,如果沒訊息,就一直不返回 Response 給客戶端,連線階段一直是阻塞的。

而 WebSocket 解決了 HTTP 的這幾個難題。當伺服器完成協議升級後( HTTP -> WebSocket ),服務端可以主動推送資訊給客戶端,解決了輪詢造成的同步延遲問題。由於 WebSocket 只需要一次 HTTP 握手,服務端就能一直與客戶端保持通訊,直到關閉連線,這樣就解決了伺服器需要反覆解析 HTTP 協議,減少了資源的開銷。

2、先看一下效果吧

2.1、效果1(一個客戶端連上服務的併發送訊息)

Python Websocket服務端通訊的使用示例

2.2、效果2(另一個客戶端連上服務的併發送訊息)

Python Websocket服務端通訊的使用示例

2.3、效果3(服務的收到客戶端的全部訊息並返回訊息)

Python Websocket服務端通訊的使用示例

2.4、效果4(一個客戶端掉線並不影響其它socket連線)

Python Websocket服務端通訊的使用示例

2.5、效果5(列取全部連線客戶端物件和當前發訊息的客戶端物件)

Python Websocket服務端通訊的使用示例

3、核心程式碼

3.1、Python

#! -*- coding: utf-8 -*-
"""
Author: ZhenYuSha
Create Time: 2019-1-14
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()

3.2、Html(JS)

 <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>

4、Github原始碼分享

https://github.com/ShaShiDiZhuanLan/Demo_Socket_Python

到此這篇關於Python Websocket服務端通訊的使用示例的文章就介紹到這了,更多相關Python Websocket服務端通訊內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!