安卓会不会用到apache mina

 我来答
huanglenzhi
推荐于2016-08-01 · 知道合伙人数码行家
huanglenzhi
知道合伙人数码行家
采纳数:117538 获赞数:517189
长期从事计算机组装,维护,网络组建及管理。对计算机硬件、操作系统安装、典型网络设备具有详细认知。

向TA提问 私信TA
展开全部
最近在做一个项目的android的网络模块,发送认证消息及请求信息至服务器,通过认证后,服务器返回我所需的数据流,选择Apache mina作为框架,在IOFilter层,我设置过滤器为
IoConnector connector=new NioSocketConnector();
connector.getFilterChain().addLast(
"myCodec",
new ProtocolCodecFilter(new TextLineCodecFactory(Charset
.forName("GB2312"))));

联网认证成功后,返回的数据流不是字符串类型,使用该过滤器报异常了:org.apache.mina.filter.codec.ProtocolDecoderException: java.nio.charset.MalformedInputException: Input length = 1 (Hexdump:
大致是字符串乱码问题,无法解析,网上查了一些资料,没有解决方案。
我想应该是过滤器设置的问题,因为返回的数据流本来就不是字符串类型,经该过滤器处理,自然会出错。我觉得应该有两种方法来解决这个问题:
(1)不使用mina自带的过滤器,自己写一个过滤器;发现这样可能比较麻烦,显得比较复杂,加上我也是新手一枚,难度有点大,放弃了...
(2)不使用mina的过滤器,mina框架为3层,过滤器设置处于第二层,我在此处不设置过滤器,直接将我要发送到服务器的内容转换为byte型数组写入IoBuffer中,将IoBuffer发送到服务器,代码如下:
connector = new NioSocketConnector(); connector.setConnectTimeoutMillis(3000);
connector.setHandler(new ClientHandler(MinaTest4AndroidActivity.this, mFd));
future = connector.connect(new InetSocketAddress(host, port));// 创建连接 future.awaitUninterruptibly();// 等待连接创建完成
String info ="这里是你需要发送到服务器的数据.......";

byte bt[]=info.getBytes();//转换为字节型数组 IoBuffer info_buffer=IoBuffer.allocate(bt.length);
info_buffer.put(bt,0,bt.length);//写入buffer中
info_buffer.flip();
session = future.getSession(); session.write(info_buffer);// 不使用过滤器,直接发送字节流

这样不经过过滤器,便不会报该异常,当然,没有了过滤器,在
@Override public void messageReceived(IoSession session, Object message)
throws Exception {
IoBuffer buffer = (IoBuffer) message;
}该函数中接收到得为IoBuffer型,然后根据需要将它转化为需要的数据类型。

这样,不会再报异常,在IoHandler中根据服务器返回的数据,再做相应的业务上的处理.......
翱翔的小鸟03
2014-11-24
知道答主
回答量:55
采纳率:0%
帮助的人:10.7万
展开全部
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式