public class MinaClientHanlder extends IoHandlerAdapter {
public void sessionOpened(IoSession session) throws Exception {
    System.out.println("sessionOpened");
    OpRequest.Builder builder = OpRequest.newBuilder();
    builder.setMsg("1111111");
    OpRequest request = builder.build();
    byte[]data =  request.toByteArray();
    ByteBuffer buffer = ByteBuffer.wrap(data);
    session.write(getObject(buffer));
}
public Object getObject(ByteBuffer byteBuffer) throws IOException, ClassNotFoundException
{
IoBuffer buffer = IoBuffer.allocate(byteBuffer.capacity()).setAutoExpand(true);
for(int i=0; i<byteBuffer.capacity();i++)
{
byteBuffer.position(i);
buffer.put(byteBuffer.get());
}
buffer.position(0);
InputStream input =  buffer.asInputStream();
ObjectInputStream oi = new ObjectInputStream(input);
Object obj = oi.readObject();
input.close();
oi.close();
return obj;
}  连接后会出现exceptionCaught invalid stream header: 12073131
胜是不解啊,求大神们帮帮忙。或者有这方面经验的朋友可以说一下你们是怎么处理的。谢谢

解决方案 »

  1.   

     InputStream input =  buffer.asInputStream();
            ObjectInputStream oi = new ObjectInputStream(input);
            Object obj = oi.readObject();
    问题应该是在这三句上,每次读都是从ObjectInputStream这个流内读,肯定会出现问题,这句应该写在服务器端。Your "server read method" is only reading one object. If it is called multiple times, you will get an error since it is trying to open several object streams from the same input stream. This will not work, since all objects were written to the same object stream on the client side, so you have to mirror this arrangement on the server side. That is, use one object input stream and read multiple objects from that.(The error you get is because the objectOutputStream writes a header, which is expected by objectIutputStream. As you are not writing multiple streams, but simply multiple objects, then the next objectInputStream created on the socket input fails to find a second header, and throws an exception.)To fix it, create the objectInputStream when you accept the socket connection. Pass this objectInputStream to your server read method and read Object from that.
      

  2.   

    我不是都将ObjectInputStream关闭了吗?而且每次都是新创建的啊。怎么会是每次都冲那个流读 ?
      

  3.   

    ObjectInputStream 这个是对象输入流,只能写一个,你虽然关闭了,还是没用的。如果想写入多个对象,又都读出来,看看这个链接吧http://blog.csdn.net/zhouhuozhi/article/details/4156357
      

  4.   

    这是使用了Protobuffer 进行序列化的对象,在发送之前需要编码,然后发送对象。你说的那个只适用于同种语言的服务器和客户端。不知道我这样理解有咩有问题