解决方案 »

  1.   

    不管是啥,最后传的都是字节,Java里面就相当于字节数组,建议自己写编解码器
      

  2.   

    我看了一下 ObjectSerialization..Decoder 的实现,找到了一点端倪,我怀疑是这样一种情况:
    java 发送字节数组的时候,在底层会将字节数组数据的长度拿到放在发送消息的前4个字节里面,
    但如果是用 c++ 来发送 char[] 数据的话,因为底层的实现不一样,所以在传送数据的首部没有指名数据长度的这4个字节,于是 ObjectSerialization..Decoder 解码失败,messageRecv 方法不被触发。
    上一段 ObjectSerialization..Decoder 的代码:
        @Override
        protected boolean doDecode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws Exception {
            if (!in.prefixedDataAvailable(4, maxObjectSize)) {
                return false;
            }        out.write(in.getObject(classLoader));
            return true;
        }
      

  3.   

    prefixedDataAvailable 的相关资料:
    http://scholers.iteye.com/blog/728377
    具体情况还有待验证,公司设备还没到位,暂时还不能进行测试,蛋疼
      

  4.   

    c++的char是一个字节,Java里却是两个字节,也许就是这个错误吧
      

  5.   

    你误解了,java 里面传的是 byte[],也是一个字节为单位的,c++ 里面的 char 也是一个字节,这应该不是问题的关键
      

  6.   

    C++你用char传的数据,Java里是用byte接收的吗
      

  7.   

    我是java初学者 最近也是用到了点mina 看了你的回复 我也学到点东西 第一个问题 可能的确是你说的那样 ObjectSerialization 应该是对象序列化 我的理解 java对象序列化 是让对象可以保存或者通过网络发送的一段连续缓冲区 c++中 原始的一段缓冲区 连对象都不是,即使是对象两种语言的对象肯定也不能做转换 所以我估计这个过滤器只是客户端也是用java写的 才行
    第二个问题 message 应该是个IoBuffer 吧,这个应该和c++上 一段缓冲区概念差不多了 看客户端发的什么了 原始的数据类型也就那么几种 整形 我当时用过getInt getShort等方法 不过遇到一个问题 就是大端小端的问题 字符串 我用的先转换成 InputStream 然后再读到byte里 再转换成字符串
      

  8.   

    如果只是纯粹的字符串的话,java 服务器和 c++ 客户端通信只要注意一下用\n 结尾就行了(过滤器用 TextLine),大端转小端只是针对发送的单个整形,短整型,对于流式的不用做处理。之前也是受到误导还以为传输的所有数据都要做一个大小端转换的处理,被折腾了好一阵子再过不久就可以做测试了,到时候如果真如我所判断那样的话,会把症结贴上来的
      

  9.   

    找到原因了,java 与 java 通讯的时候,两端送出去的对象都被编码为字节序列了,而我从 c++ 端发送给 java 端的数据,仅仅是由对象转换出来的字节序列,而非编码出来的字节序列。问题的症结可以归于 c++ 端没有现成的、类似 ObjectSerializationCodecFactory 的编解码工厂类。。哎~
      

  10.   

    找到原因了,java 与 java 通讯的时候,两端送出去的对象都被编码为字节序列了,而我从 c++ 端发送给 java 端的数据,仅仅是由对象转换出来的字节序列,而非编码出来的字节序列。问题的症结可以归于 c++ 端没有现成的、类似 ObjectSerializationCodecFactory 的编解码工厂类。。哎~
      

  11.   

    c++ 端用的 protobuf,它自带方法将 pb(protobuf简称) 对象序列化为字节数组,pb 的序列化机制和 java 的反序列化机制不对应,所以导致 java 服务器端反序列化失败,导致拿不到正确的数据。
      

  12.   

    这貌似是一个很蛋疼的问题,主机字节码,网络字节码,如果客户端与服务端用的是同一种开发语言貌似是没问题的,如果客户端与服务端的开发语言不一样的句在解析字节码的时候是会有问题的,而C++貌似在不同的操作系统上还会存在区别,
    例如C++发出的字节码是0x0000013,貌似有时候到服务端就会变成0x1300000,不知道楼主解决这个问题没有。。有没有一劳永逸的办法?