【Python 軍火庫 🧨 - websockets】用json來溝通吧!

2024/02/06閱讀時間約 6 分鐘
raw-image



我們在「【Python 軍火庫 - websockets】雙向溝通的渠道」有介紹關於Python如何去使用websockets來進行雙向溝通, 那文字的傳遞基本上沒有什麼問題, 但json、xml呢? 甚至是音訊呢?

先來說說json與xml吧, 這兩種格式也是基於文字的編碼方式, 因此只要我們能夠對格式進行序列化/反序列化即可, 那為什麼又特別著重於json這種資料交換格式呢? 主要是因為json已經成為顯學與主流了, 註明雲端廠商的API, 包括Google、微軟…, 都還是基於Rest API, 而其中的資料交換格式也是以json為標配, 因此才會著重於json的部份進行說明, 也歡迎參考「【程式語言 - Javascript】輕量資料格式 JSON」。

基本流程

class、dict -> 編碼成字串 -> websockers傳輸 -> 解碼回class、dict

關鍵的編碼與解碼

藉由 「json.dump 」來進行編碼動作, 而透過「json.load」進行解碼。

import json

# Python的dict字典型態來描述json的資料內容
data_to_dump = {
"name": "John",
"age": 30,
"city": "New York"
}

# 使用 json.dump 將數據轉換為 JSON 格式並寫入文件
with open("example.json", "w", encoding="utf-8") as json_file:
json.dump(data_to_dump, json_file, ensure_ascii=False, indent=2)

# 使用 json.load 從文件中讀取 JSON 數據並轉換為 Python 數據結構
with open("example.json", "r", encoding="utf-8") as json_file:
loaded_data = json.load(json_file)

# 打印輸出
print("原始數據:", data_to_dump)
print("讀取後的數據:", loaded_data)

用websockets這條通道來傳送吧!

Server端

啟動一個服務器來接收訊息, 並進行解碼。

import asyncio
import websockets
import json

async def handle_message(websocket, path):
async for message in websocket:
try:
# 解碼JSON訊息
data = json.loads(message)
print(f"Received message: {data}")

# 在這裡進行你的處理邏輯,這裡只是簡單地回傳相同的訊息
response_data = {"response": "Message received successfully!"}

# 將回應編碼為JSON並發送回客戶端
response_message = json.dumps(response_data)
await websocket.send(response_message)

except json.JSONDecodeError:
print("Invalid JSON format")

async def main():
async with websockets.serve(handle_message, "127.0.0.1", 8766):
print('start server: 127.0.0.1:8766')
await asyncio.Future() # run forever

asyncio.run(main())

Client端

將訊息編碼並透過websockets傳送訊息

import asyncio
import websockets
import json

async def client():
uri = 'ws://localhost:8766'
async with websockets.connect(uri) as websocket:
# 要發送的字典
data_to_send = {
'message': 'Hello, Server!',
}

# 將字典編碼為JSON
json_data = json.dumps(data_to_send)

# 透過WebSocket發送JSON訊息
await websocket.send(json_data)
print(f'Sent message: {json_data}')

# 等待回應
response = await websocket.recv()
print(f'Received response: {response}')

asyncio.run(client())

結語

接觸了websocket之後又顛覆了我們對於傳統同步程式的認知, 思維上勢必會有一段轉換期, 相信就跟一開始接觸Javascript這種程式語言的朋友一樣, 會較不習慣這種非同步的過程, 因此才會有asyncio這類的套件幫助我們在設計時能以同步的方式來進行開發程式碼, 而非同步就交由底層去處理, 讓原始碼更加的易讀、易撰寫。

91會員
260內容數
哈囉,我是阿Han,是一位 👩‍💻 軟體研發工程師,喜歡閱讀、學習、撰寫文章及教學,擅長以圖代文,化繁為簡,除了幫助自己釐清思路之外,也希望藉由圖解的方式幫助大家共同學習,甚至手把手帶您設計出高品質的軟體產品。
留言0
查看全部
發表第一個留言支持創作者!