Mina 使用ProtoBuffer 序列化出了点问题。有高手请进。万急....

Dongo2 2013-06-03 11:03:34
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
胜是不解啊,求大神们帮帮忙。或者有这方面经验的朋友可以说一下你们是怎么处理的。谢谢
...全文
292 7 打赏 收藏 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Dongo2 2013-06-11
  • 打赏
  • 举报
回复
引用 5 楼 pdw_jsp 的回复:
没太明白是怎么回事! 能代码帮忙写一下你说的意思吗?灰常感谢
这是使用了Protobuffer 进行序列化的对象,在发送之前需要编码,然后发送对象。你说的那个只适用于同种语言的服务器和客户端。不知道我这样理解有咩有问题
冰思雨 2013-06-07
  • 打赏
  • 举报
回复
看楼主给出的代码,真是一种折磨。 根本搞不太清楚,这些代码要干一件什么事情。 逻辑上,有些冲突的东西。 1.首先,这个程序,是一个客户端程序。 2.其次,当客户端建立连接后,会向服务端发送一个请求包过去。 问题,就在这个发送代码当中。 众所周知,一个消息的发送操作,会依次经历 消息对象的生成、赋值、编码转换、数据发送 这几个阶段。 楼主代码中,先构建了一个工厂对象,向里面设置的内容,之后,调用方法生成请求对象。 接下来是 编码转换(对象向二进制数据的转换过程)过程,在这个过程之后,就应该是发送。 但是,楼主的代码,就将二进制数据转换成了对象进行发送,这个过程,我很是费解。 一般情况下,只有接受数据的时候,才需要解码(二进制数据向对象的转换)过程的。
Dongo2 2013-06-06
  • 打赏
  • 举报
回复
没太明白是怎么回事! 能代码帮忙写一下你说的意思吗?灰常感谢
Dongo2 2013-06-05
  • 打赏
  • 举报
回复
我不是都将ObjectInputStream关闭了吗?而且每次都是新创建的啊。怎么会是每次都冲那个流读 ?
  • 打赏
  • 举报
回复
ObjectInputStream 这个是对象输入流,只能写一个,你虽然关闭了,还是没用的。如果想写入多个对象,又都读出来,看看这个链接吧http://blog.csdn.net/zhouhuozhi/article/details/4156357
l_9style 2013-06-04
  • 打赏
  • 举报
回复
写数据应该用ObjectOutputStream
  • 打赏
  • 举报
回复
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.
内容概要:本文针对不平衡电网条件下T型三电平并网逆变器面临的电能质量问题,提了一种基于延时相消序分量分离的自适应调控策略,并通过Simulink平台进行了系统仿真验证。研究核心在于解决电网电压不平衡所引发的并网电流畸变、负序分量耦合以及中电位波动等关键难题。通过引入延时相消法,实现了正序与负序电压、电流分量的精确、快速分离,克服了传统对称分量法在动态响应和滤波延迟方面的不足;结合自适应电流控制算法,优化了双闭环控制结构,有效抑制了不平衡工况下的谐波与负序电流,显著提升了并网电流的电能质量。同时,该策略集成了中电位平衡控制,确保了直流侧电压的稳定。该方法具有响应迅速、控制精度高、鲁棒性强等优,为复杂电网环境下的高性能并网提供了有效的技术方案。; 适合人群:具备扎实的电力电子技术、自动控制理论及新能源发电系统专业知识,从事逆变器控制算法开发、微电网电能质量治理、新能源并网技术研究等相关领域的科研人员与工程技术人员,尤其适合具有硕士及以上学历或拥有相关项目实践经验的研发人员。; 使用场景及目标:①应用于城市轨道交通、工业生产等存在显著电网不平衡的场合,提升T型三电平逆变器的并网性能与系统可靠性;②为解决因电压不平衡导致的设备过热、效率下降及保护误动等实际工程问题提供理论指导和技术支持;③作为高等院校和科研院所中电力电子与电力系统控制方向的高水平教学案例与科研仿真平台。; 阅读建议:读者应紧密结合所提供的Simulink仿真模型,深入剖析延时相消模块、自适应电流控制器及中电位平衡单元的设计原理与实现细节。建议在学习过程中亲手搭建或修改仿真模型,通过调整电网不平衡度、负载变化等参数,观察系统在不同工况下的动态响应过程,以深刻理解该自适应调控机制的优越性与内在工作机理。

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧