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社区版开发的)的配置文件