iT邦幫忙

2023 iThome 鐵人賽

DAY 4
1

前言

今天我們會初始化一個簡單的 websocket server,然後結尾會提到一些 python asyncio 的使用細節。

尋找範例

一開始在 google 下關鍵字「python websocket server example」,首先映入眼簾的會是以下幾篇文章:

  1. How To Build WebSocket Server And Client in Python – PieSocket Blog
  2. Part 1 - Send & receive - websockets 11.0.3 documentation
  3. Python之Websocket介紹與實作. 這幾天學了一些Websocket的知識,發現網路上中文文檔非常少,就來分享一下學… | by Jimmy Huang | Medium
  4. Maxkit: python 簡易 websocket server
  5. How to build a WebSocket server in Python?

會發現大部分的實作都是基於 websockets ,同時該套件最後一次更新時間為 May 7, 2023 這表示作者還有持續維護,是值得選用的套件。

而且第二篇文章就是 websockets 官方文檔提供的教程,內容也十分完整,很值得自己跟著一起動手做。如果嫌內容太多的話,可以參考 Quick start

今天我們也會以 Quick start 作為基礎來開始

後面的文章如果有細心看的話,會發現第三篇的寫法跟 Quick start 有點點不太一樣,這個後續會再提到

範例 啟動!

記得要確認 python 版本為 3.7 以上,這樣子使用 websockets 才不會出問題。

接下來我們就是複製 Quick start 提供的範例,並且執行內容。這邊也有幫大家把範例檔都下載到這裡,clone 下來就可以執行了

第一組範例:server.py, client.py

client 設定好 name 之後發送自己的 name 給 server,然後 server 收到之後回應 hello ${name}

第二組範例:show_time.html, show_time.js, show_time.py

因為前一組的範例是純粹在 python 上完成,這組範例則是可以跑在 browser 上。

額外說明

第三篇文章的範例中我們可以看到
asyncio.get_event_loop().run_until_complete(...)
asyncio.get_event_loop().run_forever()

這種寫法,在 python 3.10 版本之後已經被標註遺棄,所以在執行的時候可能會看到 DeprecationWarning: There is no current event loop 之類的字樣

要改成以下寫法才不會跳警告

async def main():
    async with websockets.serve(coroutine, "localhost", 8765):
        await asyncio.Future()  # run forever

if __name__ == "__main__":
    asyncio.run(main())

結語

今天我們看了網路上排名比較前面的實作範例,透過 Quick start 作為我們專案練習的基礎,同時也提醒一下 asyncio 在高版本會遇到的一些問題

明天我們會在這個範例的基礎之上,再陸續加上遊戲需要的機制,敬請期待!


上一篇
D3 什麼是回合制連線卡牌遊戲?
下一篇
D5 建立定型化的 websocket 連線 - REQ/RES 和 SUB/PUB 模式
系列文
chatGPT 帶你從零開始寫 websocket 連線遊戲31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言