HTM5 喊了很久了,其中 WebSocket 這功能可以實現以 JavaScript 寫出即時通訊的應用,不過 WebSocket 有瀏覽器相容性問題,因此有很多替代方案,之前有一些文章提過 Comet 這一名詞可以做出很像即時的應用,不過最近在玩 Vert.x 這東西的時候也看到了 SockJS 這東西。
SockJS 其實有制定出一種協定來讓所有瀏覽器可以使用統一的 API 來做到即時通訊,該 API 的名稱命名方式基本上也和 WebSocket 一樣,而跨瀏覽器解決相容性問題的實現方式其實是採用了混和式的方法將各種可能用上的Web技術實作出來,如以下列表用了很多 AJAX 長時連線的技巧
Browser | Websockets | Streaming | Polling |
---|---|---|---|
IE 6, 7 | no | no | jsonp-polling |
IE 8, 9 (cookies=no) | no | xdr-streaming † | xdr-polling † |
IE 8, 9 (cookies=yes) | no | iframe-htmlfile | iframe-xhr-polling |
IE 10 | rfc6455 | xhr-streaming | xhr-polling |
Chrome 6-13 | hixie-76 | xhr-streaming | xhr-polling |
Chrome 14+ | hybi-10 / rfc6455 | xhr-streaming | xhr-polling |
Firefox <10 | no ‡ | xhr-streaming | xhr-polling |
Firefox 10+ | hybi-10 / rfc6455 | xhr-streaming | xhr-polling |
Safari 5 | hixie-76 | xhr-streaming | xhr-polling |
Opera 10.70+ | no ‡ | iframe-eventsource | iframe-xhr-polling |
Konqueror | no | no | jsonp-polling |
這個專案其實是佛心來的,利用這套 SockJS Client 在前端只需要專注幾道指令不用去管甚麼相容性就能做出即時通訊應用了,而 Server 端目前支援的語言比較少 ...
SockJS family:
- SockJS-client JavaScript client library
- SockJS-node Node.js server
- SockJS-erlang Erlang server
- SockJS-tornado Python/Tornado server
- SockJS-twisted Python/Twisted server
- vert.x Java/vert.x server
Work in progress:
- SockJS-ruby
- SockJS-netty
- SockJS-gevent (SockJS-gevent fork)
- pyramid-SockJS
- wildcloud-websockets
- SockJS-cyclone
- wai-SockJS
- SockJS-perl
- SockJS-go
以上都是由 sockJS 的 github 節錄而來,
基本上這種應用應該挺要求效能的,我認為 node.js 或 vert.x 這兩套來寫 Server 端 應該比較符合實際產品開發的應用吧,sockJS 由於命名各種事件的名稱與 native WebSocket 的名稱幾乎一樣,在未來若要完全移轉到 WebSocket 應該也比較無痛吧。
有興趣的朋友可以研究看看,我也正在研究中看有沒有辦法寫出甚麼好玩的鳥當中
SockJS 的 GitHub網址是 https://github.com/sockjs/sockjs-client