編輯:關於android開發
ANOTHER TITLE:
Let’s use netty to achieve text send and receive and image transfer to server based on android and jdk1.7
就讓我來Rap<MC Hotdog>,使用netty進行安卓端發送接收文字,並且附帶發送圖片功能,折騰了幾天的netty總算有點眉目了,做下記錄。
需求是安卓端拍照上傳到服務器,服務器返回上傳成功或失敗bla bla bla,需求比較簡單。最初使用的傳統的post加multipart/form-data,一般的手機照片大小1-2M,測試沒問題,但實際情況是有的用戶使用3G網絡,有的4G,有的WIFI還有的使用2G,網絡環境稍微有點差的上傳圖片時間持續到十多分鐘(我都不好意思說了),然後想到了使用socket,然後google到了netty,有的大神說這樣的需求沒必要上netty啊,其實我就是想通過這個需求學習下關於socket,關於netty,關於channel,關於byte[],關於NIO,多學習點總是沒壞處的,後面我也可以牛逼點說玩過高性能基於事件的異步網絡框架了。
剛開始直接啃的netty.io的document,照葫蘆畫瓢抄完了TimeServer之後就滿世界的google其他的netty知識,比較零散,然後入手了《Netty權威指南第二版》,啃了幾章之後怎麼也是TimeServer,不過對NIO一些基本組件有了一個初步的認識。
OK,入正題,我要實現一個Demo,就說是個Netty的聊天室吧(群聊,沒有單聊的功能,demo味兒十足),不過客戶端換成了安卓,一個服務器對多個客戶端,所有數據經過服務器端,要定義中間信息交換組件。關於Google的Protobuf還有MessagePack和JBoss Marshalling這些編解碼中間件都沒有玩過,似乎有點看不懂,我的需求很簡單,如下圖(抱歉鍵盤黨多年手已廢掉,可能只有我自己看得懂):
一共包含三個對象:
Echo-Pojo,信息交換中間對象,用於Android端與Server端封裝byte[]之後的序列化對象。
Let’s Chat,安卓客戶端,構建EchoMessage或EchoFile對象,然後發送到channel;EchoMessage與EchoFile用於服務端判斷信息對象的類別。
Echo-Server,服務端。ChannelRead時判斷信息對象類型,決定是廣播到所有用戶還是保存文件。
對於ByteBuf對象一直沒有弄很明白,所以上述也就沒有使用。
來張安卓端(小米PAD)Let’s Chat的運行截圖:
Let’s Chat小米Pad運行截圖
三星手機Let’s Chat運行截圖:
Let’s Chat三星手機運行截圖
服務端(Echo-Server)的運行截圖:
Echo-Server輸出日志與說明截圖
上傳的文件:
文件名格式為:Build.MANUFACTURE+UUID.randomUUID()+”.jpg”,第二張圖片為12.9M,上傳時間六七秒鐘,應該還有優化的空間。
Echo-Pojo的代碼就不截圖了,直接下載查看就可以,或者也可以繼續擴展,目前只是圖片跟文字。
上述功能一共分為三個程序,Echo-Pojo信息交換對象使用eclipse-Mars2開發,Echo-Server使用Intellij idea開發,Let’s Chat使用Android Studio2,有點蛋疼,但好在實現了功能,中間折騰的很多,尤其公司電腦跟家裡電腦jdk不一致,一個1.8,一個1.7,因為這個出了很多莫名的錯誤,也浪費了很多時間,中間的各種折騰各種煩躁就不記錄了。
代碼注釋比較少,也有很多廢棄的沒有刪掉,只是實現了功能可以運行,沒有做完全整理,有問題可以直接回復或者@EMAIL ME
借鑒劉源的NettyFileTransfer,只是我把客戶端修改成了Android,然後Netty版本我用的是4.0.36Final,感謝大神。
剩下的就是把功能揉進項目裡了,Keep Fighting !
項目開源地址:https://github.com/LisonLiou/netty-learning.git
原始地址:http://lison.cc/508.html
Android插件實例——360 DroidPlugin詳解 在中國找到錢不難,但你的一個點子不意味著是一個創業。你談一個再好的想法,比如我今天談一個創意說,新浪為什麼
Android面試,與Service交互方式,androidservice五種交互方式,分別是:通過廣播交互、通過共享文件交互、通過Messenger(信使)交互、通過自
Android自定義控件系列案例【四】 案例效果: 模擬器上運行有些鋸齒,真機上和預期一樣好 案例分析: 看效果,第一直覺肯定是Android原生態控件中沒有這樣的控
Android開發實踐:Android.mk模板 關於Android NDK開發的文章已經比較多了,我的博客中也分享了很多NDK開發相關經驗和技巧,今天簡單寫了一個 An