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

閱讀時間約 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這類的套件幫助我們在設計時能以同步的方式來進行開發程式碼, 而非同步就交由底層去處理, 讓原始碼更加的易讀、易撰寫。

112會員
255內容數
哈囉,我是阿Han,是一位 👩‍💻 軟體研發工程師,喜歡閱讀、學習、撰寫文章及教學,擅長以圖代文,化繁為簡,除了幫助自己釐清思路之外,也希望藉由圖解的方式幫助大家共同學習,甚至手把手帶您設計出高品質的軟體產品。
留言0
查看全部
發表第一個留言支持創作者!
阿Han的沙龍 的其他內容
我們常常在看開源專案時, 會在函式中看到「*args」與「**kwargs」這兩個參數, 一直以來都很好奇也尚未使用, 趁著好奇心強烈的時期趕緊來了解一番, 並且將學習過程轉化為易懂的概念提供給有需要的朋友參考, 也期望我們能夠共同學習程式語言, 讓科技引領世界進步。 首先是 *args 會
Websocket是一種網路傳輸的協定,讓建立一次handshake的過程就可以相互傳遞資料,而非同步的過程能夠讓處理事情更有效率,這篇文章將帶你深入瞭解Websocket如何運作、以及其特點與優勢。
為什麼需要非同步? 我們在「【Web微知識系列】 Web Workers」有介紹到在瀏覽器可執行腳本Javascript環境底下如何完成非同步的操作, 主要是為了讓任務更有效率的進行, 不會因為一個非常耗時的工作堵塞住整個服務, 導致無法服務他人的窘境。 大家應該經常在餐廳裡會看到服務員協
我們在處理音檔時常常會使用到 [soundfile](https://pypi.org/project/soundfile/) 這套工具, 當我們試圖讀取檔案時卻發生了這樣的錯誤訊息… TypeError: Not allowed for existing files (except 'RAW')
關於多執行緒/多行程的使用方式 在Python 3.2版本之後加入了「concurrent.futures」啟動平行任務, 它可以更好的讓我們管理多執行緒/多行程的應用場景,讓我們在面對這種併發問題時可以不必害怕, 用一個非常簡單的方式就能夠處裡, 底下我們將為您展示一段程式碼: imp
這個問題發生在我們開發Python的Websocket Server時, 使用以下的程式碼架設服務 start_server = websockets.serve(server, 'localhost', args.port) async with start_server:
我們常常在看開源專案時, 會在函式中看到「*args」與「**kwargs」這兩個參數, 一直以來都很好奇也尚未使用, 趁著好奇心強烈的時期趕緊來了解一番, 並且將學習過程轉化為易懂的概念提供給有需要的朋友參考, 也期望我們能夠共同學習程式語言, 讓科技引領世界進步。 首先是 *args 會
Websocket是一種網路傳輸的協定,讓建立一次handshake的過程就可以相互傳遞資料,而非同步的過程能夠讓處理事情更有效率,這篇文章將帶你深入瞭解Websocket如何運作、以及其特點與優勢。
為什麼需要非同步? 我們在「【Web微知識系列】 Web Workers」有介紹到在瀏覽器可執行腳本Javascript環境底下如何完成非同步的操作, 主要是為了讓任務更有效率的進行, 不會因為一個非常耗時的工作堵塞住整個服務, 導致無法服務他人的窘境。 大家應該經常在餐廳裡會看到服務員協
我們在處理音檔時常常會使用到 [soundfile](https://pypi.org/project/soundfile/) 這套工具, 當我們試圖讀取檔案時卻發生了這樣的錯誤訊息… TypeError: Not allowed for existing files (except 'RAW')
關於多執行緒/多行程的使用方式 在Python 3.2版本之後加入了「concurrent.futures」啟動平行任務, 它可以更好的讓我們管理多執行緒/多行程的應用場景,讓我們在面對這種併發問題時可以不必害怕, 用一個非常簡單的方式就能夠處裡, 底下我們將為您展示一段程式碼: imp
這個問題發生在我們開發Python的Websocket Server時, 使用以下的程式碼架設服務 start_server = websockets.serve(server, 'localhost', args.port) async with start_server:
你可能也想看
Google News 追蹤
Thumbnail
接下來第二部分我們持續討論美國總統大選如何佈局, 以及選前一週到年底的操作策略建議 分析兩位候選人政策利多/ 利空的板塊和股票
Thumbnail
🤔為什麼團長的能力是死亡筆記本? 🤔為什麼像是死亡筆記本呢? 🤨作者巧思-讓妮翁死亡合理的幾個伏筆
Thumbnail
介紹均線從數學上的本質、均線的種類,以及均線的延伸常見技術指標。另外會附上 Python 的實現算法(著重 SMA & EMA)。但不會介紹使用策略。 「取平均」是做統計分析裡面非常基礎、很早學到、常用的做法,而均線(Moving Average)也是技術指標當中最常被當第一個學習的指標。
時間在程式設計中扮演著重要的角色,Python 的 time 模組提供了許多與時間相關的功能和函式,可以方便地進行時間的獲取、格式化、延遲等操作。在本文中,我們將介紹 time 模組的一些常見用法和範例。
當使用Python讀取JSON檔案時,你可以使用json模組來處理。下面是一個詳細的教學文章,展示如何使用Python讀取JSON檔案。
在這個教學中,我們將使用Python程式語言來繪製倒三角形。我們將使用"*"符號來構建倒三角形的形狀。
安裝 pyautogui 在開始之前,我們需要先安裝 pyautogui 模塊。
在這篇文章中,我們將講解一些常見的語音技術以及如何在Python中使用這些技術。 安裝套件 匯入套件 語音辨識:
使用 pyautogui 套件來取得所有正在視窗 (windows)。
Thumbnail
當我們抓取了相當多的網站資料,這些來自不同網站的資料總不可能全都匯集成一張Excel吧,因此通常在寫程式的使用者,都需要一個可以存放資料,並進行串聯的資料庫(SQL),因此我們今天就來教大家如何安裝使用免費的資料庫吧!!
Thumbnail
幾年前,偶然的在某社群聽見 Robot Framework 這套開源框架,起初抱持著好奇的心情簡單的玩了一下,不過當時完全不理解,用這種 Keyword 方式去撰寫自動化測試的好處在哪? ( 不過就是…我知識不足罷了XD ) 。 接下來,我就可以跑測試拉~! 接著看 log.html:
Thumbnail
什麼是Pytest? Pytest是一款強大的Python測試工具,支援平行化測試,使用上簡單方便,適合用在各種不同類型的軟體架構,也適用於RD、QA或獨立測試小組,也適合正要導入TDD的公司。 來寫測試吧! 先用pip安裝pytest: libs\module.py 參考資料:
Thumbnail
接下來第二部分我們持續討論美國總統大選如何佈局, 以及選前一週到年底的操作策略建議 分析兩位候選人政策利多/ 利空的板塊和股票
Thumbnail
🤔為什麼團長的能力是死亡筆記本? 🤔為什麼像是死亡筆記本呢? 🤨作者巧思-讓妮翁死亡合理的幾個伏筆
Thumbnail
介紹均線從數學上的本質、均線的種類,以及均線的延伸常見技術指標。另外會附上 Python 的實現算法(著重 SMA & EMA)。但不會介紹使用策略。 「取平均」是做統計分析裡面非常基礎、很早學到、常用的做法,而均線(Moving Average)也是技術指標當中最常被當第一個學習的指標。
時間在程式設計中扮演著重要的角色,Python 的 time 模組提供了許多與時間相關的功能和函式,可以方便地進行時間的獲取、格式化、延遲等操作。在本文中,我們將介紹 time 模組的一些常見用法和範例。
當使用Python讀取JSON檔案時,你可以使用json模組來處理。下面是一個詳細的教學文章,展示如何使用Python讀取JSON檔案。
在這個教學中,我們將使用Python程式語言來繪製倒三角形。我們將使用"*"符號來構建倒三角形的形狀。
安裝 pyautogui 在開始之前,我們需要先安裝 pyautogui 模塊。
在這篇文章中,我們將講解一些常見的語音技術以及如何在Python中使用這些技術。 安裝套件 匯入套件 語音辨識:
使用 pyautogui 套件來取得所有正在視窗 (windows)。
Thumbnail
當我們抓取了相當多的網站資料,這些來自不同網站的資料總不可能全都匯集成一張Excel吧,因此通常在寫程式的使用者,都需要一個可以存放資料,並進行串聯的資料庫(SQL),因此我們今天就來教大家如何安裝使用免費的資料庫吧!!
Thumbnail
幾年前,偶然的在某社群聽見 Robot Framework 這套開源框架,起初抱持著好奇的心情簡單的玩了一下,不過當時完全不理解,用這種 Keyword 方式去撰寫自動化測試的好處在哪? ( 不過就是…我知識不足罷了XD ) 。 接下來,我就可以跑測試拉~! 接著看 log.html:
Thumbnail
什麼是Pytest? Pytest是一款強大的Python測試工具,支援平行化測試,使用上簡單方便,適合用在各種不同類型的軟體架構,也適用於RD、QA或獨立測試小組,也適合正要導入TDD的公司。 來寫測試吧! 先用pip安裝pytest: libs\module.py 參考資料: