我們在「【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)
啟動一個服務器來接收訊息, 並進行解碼。
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())
將訊息編碼並透過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這類的套件幫助我們在設計時能以同步的方式來進行開發程式碼, 而非同步就交由底層去處理, 讓原始碼更加的易讀、易撰寫。