前些日子在網上看到此文《為Phonegap Android平台增加websocket支持,使默認成為socket.io首選通道選擇》,感覺挺有意思,於是研究了一下相關的東西。
Android並不支持原生支持WebSocket,即使到了Android4.x時代。而且Android上webkit的表現很差。需要開發者提供支持。github上有兩個開源項目,一個是https://github.com/anismiles/websocket-android-phonegap,實現了websocket協議。提供了html5兼容的websocket api。這個項目雖說名字中有個phonegap,但是其實和phonegap一點關系都沒有,非說有點關系的話就是可以使用這個配合phonegap開發應用。源碼掃了幾眼,並不復雜,稍微復雜的地方在於實現websocket協議。網上還有一個https://github.com/koush/android-websockets,這個不僅實現了Websocket,還實現了socket.io的接口。
Client端ok了之后,在看Server端。我沒選用socket.io,雖然socket.io的設計更有趣味一些。沒用的原因是,socket.io做了很多兼容方面的考慮,代碼相對復雜。對於不支持websocket的瀏覽器,會切換到長輪詢的兼容模式。我初接觸,想找個輕量級別的,這樣更容易看源碼,明白是怎么回事。網上找到這個https://github.com/miksago/node-websocket-server,使用nodejs寫的,我試了一下,這個在nodejs6.+版本以后有問題。后來找到https://github.com/VanCoding/node-websocket-server這個,對它進行了修正,並且支持了新的websocket協議的drafts(This is a server for drafts 75, 76, 10 and 16 of the WebSocket Protocol)。然后使用了html5demos里的echo服務器代碼,稍微做了一點修改。然后把服務放到了NAE上,NAE很早就注冊了,但一直沒玩兒,今天總算派上了用場,一些小波折后服務器上線了。NAE感覺還有些不穩定,偶爾鏈接會斷掉。
然后就實現一個簡單的聊天室應用。Android端選用websocket-android-phonegap來支持websoket,Server端使用基於nodejs的node-websocket-server(VanCoding)的實現。
首先熟悉一下WebSocket的api,很簡單。首先,可以通過判斷是否存在window.WebSocket對象來判斷,瀏覽器是否支持WebSocket。然后可以通過創建WebSocket對象建立與目標服務器的連接。如ws = new WebSocket("ws://host:port")。這個時候服務器端就會響應連接。建立連接后,可以給websocket對象添加事件回調監聽函數。WebSocket共有三個事件,分別是open,close,message,對應的回調分別是onopen,onclose, onmessage。建立連接后會回調onopen,關閉連接回調onclose,有消息時會回調onmessage。
就這些東西,寫的倉促,代碼也很水,這算是HTML5第二彈吧,之前寫過一個Canvas的東西,《用html5的canvas寫了個書籍翻頁效果》。
項目地址:https://github.com/qhm123/firechat
網頁版聊天室:http://firechat.cnodejs.net/client.html
(額外的故事:剛動筆寫完此文第一句話,然后就動手寫了個通過html5test.com測試Android手機HTML5支持情況的並截圖分享的應用,但是在手機端的App分享上傳時,因為圖片太長了,所以對圖片壓縮到了基本上都壓縮到看不清的程度了,浪費我的時間。。。)