nettyandroid
① Qt C++與Android Netty之間傳輸位元組碼問題
1 技術棧結構
服務端是qt c++寫的,客戶端是android移動設備,程序語言為java。
2 技術流
android端連接伺服器,之間的通訊協議用protobuf,傳輸的是位元組碼流。qt :QByteArray; Java : byte[]數組
3 發送數據
Qt:
QTcpSocket conn;
QByteArray ba;
conn.write(ba.data(), ba.length());
Android:
Bootstrap bootstrap =new Bootstrap();
bootstrap.group(group).channel(NioSocketChannel.class)
.option(ChannelOption.TCP_NODELAY,true)
.handler(new ChannelInitializer() {
@Override
protected void initChannel(SocketChannel ch)throws Exception {
ch.pipeline()
.addLast(new ByteArrayEncoder())//這個很關鍵
.addLast(new ByteArrayDecoder())//這個很關鍵
.addLast(new NettyHandler(new NettyHandler.HandlerCallback() {
@Override
public void onError() {
if(mListener !=null){
mListener.onError(ERROR_RECV);
}
}
@Override
public void onDataRecv(byte[] data) {
if(mListener !=null){
mListener.onRecvData(data);
}
}
}));
}
});
mChannelFuture =bootstrap.connect(host, port)
.addListener(future -> {
boolean isSuccess = future.isSuccess();
if(isSuccess ==true){
if(mListener !=null){
mListener.onConnectSuccess();
}
}else{
if(mListener !=null){
mListener.onConnectFail();
}
}
})
.sync();
}catch (Exception e){
e.printStackTrace();
group.shutdownGracefully();
if(mListener !=null){
mListener.onError(ERROR_CONNECT);
}
}
② 如何編譯 netty 源碼並導入android studio
2-1基礎准備工作首先你得安裝配置了AndroidStudio,具體不明白的參考《AndroidStudio入門到精通》。接著你得下載好了源碼Code,至於如何下載這里不再說明,比較簡單,上官網查看就行了。其次你需要保證源碼已經被編譯生成了out相關目錄文件。好了,如上就是一些基本准備工作,針對定製源碼或者原生源碼來說,這些准備步驟都是必須的,沒必要再強調了。2-2配置導入及使用2-2-1編譯源碼idegen模塊及生成AS配置文件(*.ipr)在開始編譯idegen模塊前,你一定知道需要先全局編譯出out目錄及相關文件吧,這個不再過多說了,我們通過如下命令編譯idegen模塊:mmmdevelopment/tools/idegen/11這行命令的意思是編譯idegen這個模塊項目,然後生成idegen.jar文件(不信你自己去查看這個模塊的Android.mk的目標吧,不多解釋)。運行完以後如果看到如下信息則說明編譯OK:####makecompletedsuccessfully(7seconds)####1212接著執行如下腳本:development/tools/idegen/idegen.sh11這行命令的意思是在根目錄生成對應的android.ipr、android.imlIEDA工程配置文件。等待片刻得到類似如下信息說明OK:Readexcludes:21msTraversedtree:194799ms1212通過如上操作我們就完成了基本的源碼配置工作。2-2-2導入AndroidStudio前的一些客戶化操作大家都知道使用Eclipse倒入源碼很慢,AndroidStudio導入源碼時也慢,所以建議修改android.iml文件(將自己不用的代碼去掉),然後再導入Studio。
③ android 支持netty嗎
這個是支持的。
什麼是netty,有興趣的朋友可以google一下netty,可以知道這東東做什麼用,當然你也可以選擇mina,一樣的都是java nio框架.
選擇netty是支持protobuf(google內部使用頻率比較高的,之前的android源碼中內含有這一部分的代碼)協議,這樣可以解決網路編程中粘包(也可以理解成傳輸過程中長度的問題,有興趣可以看相關文章).
④ 如何編譯 netty 源碼並導入android studio
一、修改Android Studio(以下簡稱AS)的內存配置
因為在導入源碼時需要消耗大量內存,所以先修改IDEA_HOME/bin/studio.vmoptions中-Xms和-Xmx的值。文檔中使用的是748m, 可自行修改。
二、配置AS的JDK、SDK
在IDE中添加一個沒有classpath的JDK, 這樣可以確保使用源碼里的庫文件
並將其作為要使用的SDK的Java SDK。
三、生成導入AS所需配置文件(*.ipr)
①編譯源碼(為了確保生成了.java文件,如R.java;如果編譯過,則無需再次編譯)
②檢查out/host/linux-x86/framework/目錄下是否有idegen.jar
如果idegen.jar不存在,執行:
mmm development/tools/idegen/
在5.0.1的源碼中會生成res.java的文件夾,導致idegen.jar運行時拋FileNotFoundException,這是idegen的代碼不夠嚴謹造成的。
我的分享里有修改這個bug的patch,或者直接使用我分享的idegen.jar。
③執行
development/tools/idegen/idegen.sh
等待出現類似下面的結果:
Read excludes: 5ms
Traversed tree: 44078ms
這時會在源碼的根目錄下生成android.ipr和android.iml兩個IntelliJ IDEA(AS是基於IntelliJ IDEA社區版開發的)的配置文件