使用Mina2做的消息系统, 目前在外网测试中..  
每天会出现20几次这样的错误
解析http请求时报如下错误:
java.nio.charset.MalformedInputException: Input length = 1
        at java.nio.charset.CoderResult.throwException(Unknown Source) [na:1.6.0_17]
        at org.apache.mina.core.buffer.AbstractIoBuffer.getString(AbstractIoBuffer.java:1442) [comet-server.jar:na]
API 中的说明是当输入字节序列对于给定 charset 来说是不合法的,或者输入字符序列不是合法的 16 位 Unicode 序列时,抛出此经过检查的异常。虽然出现率不高,老大还是怀疑是解码模块的问题。 有没有有经验的朋友来解答一下?

解决方案 »

  1.   

    Decode Mina2里的Iobuffer的时候报的异常
    private static final CharsetDecoder DEFAULT_DECODER = Charset.forName(
    "UTF-8").newDecoder();
    BufferedReader reader = new BufferedReader(new StringReader(in
    .getString(DEFAULT_DECODER)));这个我还真不知道怎么调试了。  
      

  2.   

    这种现象是很正常的,由于网络上是一bit为单位传输,而TCP层上送的数据是以字节为单位,虽然NIO是以块为单位操作的,但是应用层处理时还是得以字节为单位处理。但是你使用的应该是ByteBuffer的派生类,(猜测是CharBuffer)它是以两个字节为单位处理报文的,因此很容易出现楼主的问题。解决方案:
    在处理数据之前,先判断ByteBuffer中的字节数,如果为奇数,则直接return false;不进行处理,等下一个消息来到时统一处理(注:可以这样做的原因是,这种现象是由于传输层上送的数据非完整应用层包)
      

  3.   

    遇到过java.nio.charset.MalformedInputException: Input length = 1,不过情况跟你不一样。
    我这边是因为发送的数据没有转成utf-8,但是获取的时候是iobuffer.getString("utf-8"),所以出错了。
      

  4.   

    因为在GBK中字母占1byte汉字占2byte。ByteBuffer如果设置长度为偶数时,如果有奇数个字母那么最后的byte就是汉字的一部分,转码的时候就会出错。Bytebuffer设为奇数正好相反。可以判断ByteBuffer.get(index)大于0小于127的个数,然后确定最后一位是否要放到下次读入的第一位