【Python 軍火庫🧨 - websockets】雙向溝通的渠道

更新於 發佈於 閱讀時間約 5 分鐘
raw-image



我們在「【Web微知識系列】雙向溝通的技術,什麼是Websocket?」 有提到關於Websocket的概念, 他是一種網路傳輸的協定, 讓我們建立一次handshake的過程就可以相互傳遞資料, 而不用每次都重新進行Request請求, 進而耗費開啟/關閉連線的時間, 且省去了相互等待的依賴。

為什麼會說減少相互等待的過程呢? 因為Websocket的本質就是非同步的概念, 而關於非同步也歡迎參考「【Python - asyncio】非同步 I/O 簡介」, 它是一種我丟資料給你, 但你不一定馬上回報給我, 做完再回報給我即可的概念, 因此這中間的空檔就可以去完成其他的事物, 讓處理事情變得更有效率。

那就讓我們用實作來看看一個簡單的websocket究竟是怎麼運作的吧!

安裝套件

pip install websockets

Server端

功能: 我們的Server端會接收來自Client的訊息並回應「已經收到了」。

有沒有發現, 幾乎函式都與async、await離不開關係, 所以真心建議好好研讀「【Python - asyncio】非同步 I/O 簡介」才能夠更加得心應手。

import asyncio
import websockets

async def server(websocket, path):
while True:
try:
message = await websocket.recv()

await websocket.send(f"已收到來自Client的訊息: {message}")
except websockets.exceptions.ConnectionClosedOK:
print("Client disconnected")
break

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

asyncio.run(main())

啟動後就是不斷的等待Client端的連線, 而server函式裡就是我們進行訊息溝通的相關處理。

python server.py

start server: 127.0.0.1:8766

Client端

Client端的部份主要讓使用者輸入文字, 並將文字傳送到伺服端, 而收到伺服端的訊息之後印出於終端機。

import asyncio
import websockets

async def client():
async with websockets.connect("ws://127.0.0.1:8766") as websocket:
while True:
message = input("請輸入訊息 (type 'exit' to quit): ")
await websocket.send(message)

if message.lower() == "exit":
break

response = await websocket.recv()
print(f"來自Server的訊息: {response}")

asyncio.run(client())

使用的過程如下:

python client.py

請輸入訊息 (type 'exit' to quit): 你好
來自Server的訊息: 已收到來自Client的訊息: 你好

有什麼特點?

  • 傳遞雙方約定好的資料格式,對於業務不清楚的攻擊者需要花費較多的時間來進行試誤, 但這就像把雙面刃, 接手的夥伴也較不容易上手, 尤其是特別複雜的應用。
  • 非同步讓我們不再傻傻的等待回應, 對於Client端來說能夠將時間分配到其他任務。
  • 容易實現即時應用。

結語

雙向溝通與非同步應用其實非常有趣, 主要在解決我們的即時性應用問題, 並且搭配非同步讓我們的運作更有效率, 就像是餐廳的服務員一樣, 將客戶帶位到目的後, 先請客戶看菜單, 而這段時間就能去服務其他客人, 不會單純的等待浪費時間,而websocket的部份則是讓我們傳輸過程中可以僅建立一次的連線, 基於這條連線不斷的傳輸資料, 尤其是串流的應用, 也省去的不斷三方交握的繁瑣程序。

avatar-img
120會員
270內容數
哈囉,我是阿Han,是一位 👩‍💻 軟體研發工程師,喜歡閱讀、學習、撰寫文章及教學,擅長以圖代文,化繁為簡,除了幫助自己釐清思路之外,也希望藉由圖解的方式幫助大家共同學習,甚至手把手帶您設計出高品質的軟體產品。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
阿Han的沙龍 的其他內容
為什麼需要非同步? 我們在「【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:
假設我們今天想要訓練一個AI模型, 那麼我們會有一批大型資料集, 通常會根據比例來切分三個模型訓練所需的訓練集(train)、驗證集(dev)、測試集(test), 而我們本次會示範一下Python如何對一個List清單進行切分, 基本上大同小異, 我們只要掌握作法即可概念相通。 任務提示
我們在使用Python語言進行軟體開發時, 常常會需要dict這個資料結構來儲存複雜結構的資料, 就如同JSON一般, 我們會具有這樣的Key/Value模式組成的資料結構, 如下圖: 而當我們在Python的世界裡, 除了嚴謹規範資料欄位的@dataclass之外, 更常使用的就是「di
為什麼需要非同步? 我們在「【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:
假設我們今天想要訓練一個AI模型, 那麼我們會有一批大型資料集, 通常會根據比例來切分三個模型訓練所需的訓練集(train)、驗證集(dev)、測試集(test), 而我們本次會示範一下Python如何對一個List清單進行切分, 基本上大同小異, 我們只要掌握作法即可概念相通。 任務提示
我們在使用Python語言進行軟體開發時, 常常會需要dict這個資料結構來儲存複雜結構的資料, 就如同JSON一般, 我們會具有這樣的Key/Value模式組成的資料結構, 如下圖: 而當我們在Python的世界裡, 除了嚴謹規範資料欄位的@dataclass之外, 更常使用的就是「di
你可能也想看
Google News 追蹤
提問的內容越是清晰,強者、聰明人越能在短時間內做判斷、給出精準的建議,他們會對你產生「好印象」,認定你是「積極」的人,有機會、好人脈會不自覺地想引薦給你
Thumbnail
當我們在進行「語音辨識」的應用開發時, 首先會面臨一個問題, 那就是究竟要怎麼知道哪些段落是「人在說話的區段」, 精確的標示出這些區段之後, 我們除了可以儲存成純對話的段落, 還可以做出時間軸的字幕檔, 應用非常廣泛, 因此學會怎麼用VAD是進入語音領域非常重要的其中一個環節。 VAD代表
Thumbnail
EasyOCR是一個能夠幫助你對圖片中的文字進行辨識的工具,透過進階分析,可以應用在文件掃描、自動化數據輸入、發票掃描等領域。本章節將介紹如何安裝、引用模型、進行文字辨識、以及辨識結果的分析。透過學習,你可以建立屬於自己的文字辨識系統。
Thumbnail
關於Websockets的篇章, 有興趣的朋友歡迎參考: 【Python 軍火庫 - websockets】雙向溝通的渠道 【Python 軍火庫 - websockets】用json來溝通吧! 而這一篇章的主題主要是來分享如何透過websockets傳遞音檔並進行解碼, 我們都知道聲
Thumbnail
本文介紹了Python如何使用websockets進行雙向溝通,包括文字、json、xml和音訊的傳遞。特別著重於json資料交換格式,以及websockets通道的基本流程和關鍵的編碼與解碼。最終談到WebSocket對於傳統同步程式的轉變及對asyncio等套件的重要性。
提問的內容越是清晰,強者、聰明人越能在短時間內做判斷、給出精準的建議,他們會對你產生「好印象」,認定你是「積極」的人,有機會、好人脈會不自覺地想引薦給你
Thumbnail
當我們在進行「語音辨識」的應用開發時, 首先會面臨一個問題, 那就是究竟要怎麼知道哪些段落是「人在說話的區段」, 精確的標示出這些區段之後, 我們除了可以儲存成純對話的段落, 還可以做出時間軸的字幕檔, 應用非常廣泛, 因此學會怎麼用VAD是進入語音領域非常重要的其中一個環節。 VAD代表
Thumbnail
EasyOCR是一個能夠幫助你對圖片中的文字進行辨識的工具,透過進階分析,可以應用在文件掃描、自動化數據輸入、發票掃描等領域。本章節將介紹如何安裝、引用模型、進行文字辨識、以及辨識結果的分析。透過學習,你可以建立屬於自己的文字辨識系統。
Thumbnail
關於Websockets的篇章, 有興趣的朋友歡迎參考: 【Python 軍火庫 - websockets】雙向溝通的渠道 【Python 軍火庫 - websockets】用json來溝通吧! 而這一篇章的主題主要是來分享如何透過websockets傳遞音檔並進行解碼, 我們都知道聲
Thumbnail
本文介紹了Python如何使用websockets進行雙向溝通,包括文字、json、xml和音訊的傳遞。特別著重於json資料交換格式,以及websockets通道的基本流程和關鍵的編碼與解碼。最終談到WebSocket對於傳統同步程式的轉變及對asyncio等套件的重要性。