前情提要
tl;dr, websocket 至少是一個 10 年以上的技術了,但是筆者一直沒有機會實作它。
大部份的時候是應用場景不符合,或是簡單 Long Polling 已經足夠,甚至就算用 Polling 這個方法也無法把 Server 打掛。
另一個情況是團隊已經很成熟,有專門負責的部門在統一處理這塊邏輯,
而通常這塊邏輯會與主要的核心功能作切分,所以我也沒有機會接觸到。
這次難得有個小型的專案,有機會實作,故稍作記錄一下。
需求
使用者會停留在某些頁面等待系統的資料狀態更新,大約每 10 秒要作一次 Polling,
而平均資料狀態更新需要 3~10 分鐘不等。在這個情況下要改用 websocket,
(註:我不認為這是一個很好的應用場景,但是牽扯更多未揭露的調整故不展開討論,
EX:Heartbeat、Keep-Alive 等等…機制也未討論到)
WebSocket Server 實作
使用的技術:Typescript + Express + ServerSocket
1 | // import library |
前端實作,收送雙向
使用的技術:JavaScript
以下內容大多參考於神 Q 超人的文章,
作為參考用,實務上會搭配使用的前端框架作修改。
1 | var ws; |
後端實作,只送不收
使用技術: php
1 |
|
後記
實務上在股票看盤即時更新、多人聊天室、多人網頁遊戲上或許十分有用,
但實際上在這此的案例上就有些大材小用了,先當作學習了。
在查找資料的過程有一段話很受用,
我稍作總結如下:
當討論到 WebSocket 時,不應用 Http 的標準去審視它,
更應該關注這些 Connection 會持續連接多久? Connection 之間交互的行為是什麼?
是運算密集的行為還是讀寫密集的行為?…等等,才是你決策的關鍵。
參考
- WebSocket 与 TCP/IP
- JavaScript | WebSocket 讓前後端沒有距離
- 关于 websocket 到底要不要做心跳
- How To Connect To WebSockets With PHP
- A JSON event-based convention for WebSockets
- Socket.io
- Pusher.com
(fin)