首頁 > 後端開發 > Python教學 > 使用 Python 代理實現可擴展的外匯 WebSocket

使用 Python 代理實現可擴展的外匯 WebSocket

Susan Sarandon
發布: 2025-01-04 18:55:40
原創
562 人瀏覽過

Implementing a Scalable Forex WebSocket Using a Python Proxy

本指南將教您如何使用 Python 建立 WebSocket 代理伺服器。

伺服器將執行以下操作:

  • 驗證客戶端身分:在允許客戶端連線之前,會檢查每個用戶端是否擁有唯一的「使用者金鑰(API Key)」。
  • 連接到另一個 WebSocket: 伺服器將連接到一個單獨的 WebSocket 伺服器。
  • 中繼訊息:伺服器將從連接的 WebSocket 接收訊息並將其傳送給所有經過驗證的用戶端。

開始之前:

  • 確保您已安裝Python 3.6或更高版本。 WebSockets 需要 Python 3.6 或更高版本。
  • 安裝 WebSockets 庫:您可以在終端機中使用以下命令來安裝它。
pip install websockets
登入後複製

1. 入門

  • 為您的專案建立一個新資料夾。
  • 在資料夾中建立一個新的 Python 檔案並將其命名為「websocket_proxy_server.py」。該文件將保存您伺服器的所有代碼。

2. 建立WebSocket伺服器

  • 導入所需的庫。您將需要之前安裝的庫。
  • 建構伺服器的基本結構。使用 WebSockets 庫為您的伺服器建立基礎。
import asyncio
import websockets
import json

class WebSocketProxy:

    def init(self, source_url, symbols):

        self.source_url = source_url
        self.clients = set()
        self.symbols = symbols
        self.valid_user_key = "yourValidUserKey"  # Single valid user key for authentication

    async def on_open(self, ws):

        print("Connected to source")
        symbols_str = ",".join(self.symbols.keys())
        init_message = f"{{"userKey":"your_api_key", "symbol":"{symbols_str}"}}"
        await ws.send(init_message)
登入後複製

3. 連線並驗證客戶端

  • 確保伺服器已全部設定為接受來自客戶端的連線。
  • 新增檢查以驗證每個客戶的身份。當客戶端嘗試連線時,伺服器應要求提供「使用者金鑰」。只有具有正確密鑰的客戶端才被允許連線。
async def client_handler(self, websocket, path):

        try:

            # Wait for a message that should contain the authentication key
            auth_message = await asyncio.wait_for(websocket.recv(), timeout=10)
            auth_data = json.loads(auth_message)
            user_key = auth_data.get("userKey")

            if user_key == self.valid_user_key:
                self.clients.add(websocket)
                print(f"Client authenticated with key: {user_key}")

                try:
                    await websocket.wait_closed()

                finally:
                    self.clients.remove(websocket)

            else:

                print("Authentication failed")
                await websocket.close(reason="Authentication failed")
        except (asyncio.TimeoutError, json.JSONDecodeError, KeyError):
            print("Failed to authenticate")
            await websocket.close(reason="Failed to authenticate")
登入後複製

4. 連接到來源並共享訊息

  • 建立一個函數,使伺服器保持與原始 WebSocket 的連線。
  • 此函數應該會自動將從原始 WebSocket 接收到的訊息傳送到所有成功驗證的用戶端。
async def source_handler(self):
        async with websockets.connect(self.source_url) as websocket:
            await self.on_open(websocket)
            async for message in websocket:
                await self.broadcast(message)

    async def broadcast(self, message):
        if self.clients:
            await asyncio.gather(*(client.send(message) for client in self.clients))
登入後複製

5. 啟動伺服器

  • 建立一個函數來啟動伺服器並監聽連線。
  • 新增程式碼來執行此函數,啟動您的 WebSocket 代理伺服器。
def run(self, host="localhost", port=8765):
        start_server = websockets.serve(self.client_handler, host, port)
        asyncio.get_event_loop().run_until_complete(start_server)
        asyncio.get_event_loop().run_until_complete(self.source_handler())
        asyncio.get_event_loop().run_forever()

if name == "main":
    symbols = {"EURUSD": {}, "GBPUSD": {}, "USDJPY": {}, "AUDUSD": {}, "USDCAD": {}}
    source_url = "ws://example.com/source"
    proxy = WebSocketProxy(source_url, symbols)
    proxy.run()

登入後複製

總之

您已經成功開發了一個基於Python的WebSocket代理伺服器。此伺服器可以驗證客戶端身份,維護與指定資料來源的持久連接,並將從來源接收的訊息有效地分發給所有經過驗證的客戶端。事實證明,對於需要將資料從單一來源安全即時傳播到不同用戶群的應用程式來說,此功能非常寶貴。

下一步

徹底的伺服器測試對於確保最佳效能和可靠性至關重要。它驗證其對連接和訊息傳輸的正確處理。為了提高效率,請考慮實施負載平衡機制和自訂連線標頭。最後,建議將伺服器部署到適合生產部署的環境,例如專門為容納長期網路連線而設計的雲端服務。

另外,請查看我們網站上最初發布的教學:使用 Python 代理程式擴展外匯 WebSocket

以上是使用 Python 代理實現可擴展的外匯 WebSocket的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板