-
关于MINA框架中报文读取的问题10
小弟在做项目的时候遇到了一个棘手的问题,希望各位大神出手相助!
如题,用的是MINA框架,读取短报文的时候没任何问题,但是在读取较长的报文的时候,老是会少读点东西,例如XML形式的字符串的某个标签。
下面是解码器:
package mds.gps.mina; import java.nio.ByteBuffer; import mds.gps.utils.HexUtil; import org.apache.mina.core.buffer.IoBuffer; import org.apache.mina.core.session.IoSession; import org.apache.mina.filter.codec.ProtocolDecoder; import org.apache.mina.filter.codec.ProtocolDecoderOutput; import com.sun.org.apache.bcel.internal.generic.NEW; /** * MINA解码器 * * @author Administrator * */ public class MyTextLineDecoder implements ProtocolDecoder { IoBuffer buf = IoBuffer.allocate(8192).setAutoExpand(true).setAutoShrink(true); public void decode(IoSession session, IoBuffer in, ProtocolDecoderOutput output) throws Exception { System.out.println(in.capacity()); ByteBuffer receiveBytes; buf.flip(); //字符串拼接缓冲 String cache=MinaClient.getStrRec(); // while (in.hasRemaining()) { byte b = in.get(); if (b == '\n') { buf.flip(); byte[] bytes = new byte[buf.limit()]; buf.get(bytes); String message =cache+new String(bytes,"gbk")+"\n"; cache=message; MinaClient.setStrRec(cache); //读到这个标签就结束,输出 if(cache.contains("</package>")){ output.write(cache); MinaClient.setStrRec(""); cache=""; } buf.clear(); buf.flip(); buf = IoBuffer.allocate(8192).setAutoExpand(true).setAutoShrink(true); } else { buf.put(b); } } } public void dispose(IoSession arg0) throws Exception { System.out.println("disposedisposedisposedisposedisposedisposedisposedisposedisposedisposedisposedisposedispose"); } public void finishDecode(IoSession arg0, ProtocolDecoderOutput arg1) throws Exception { System.out.println("finishDecodefinishDecodefinishDecodefinishDecodefinishDecodefinishDecodefinishDecodefinishDecode"); } }
接下来是读取的xml形式的字符串,总是少读一标签导致解析出错:
<?xml version="1.0" encoding="utf-8"?> <package> <head> <version>1</version> <message>ResGetDepartmentList</message> <session>f6a9f429d2e54e9782740bad6c84c4ab</session> <workflow>67606</workflow> </head> <body> <departmentlist><department><id>1</id> <name>绿源</name> <father>0</father> </department> <department><id>2</id> <name>绿源测试</name> <father>1</father> </department> <department><id>3</id> <name>经销商2</name> <father>1</father> </department> <department><id>4</id> <name>经销商3</name> <father>1</father> </department> <department><id>8</id> <name>qqqqqqqq</name> <father>1</father> </department> <department><id>9</id> <name>ww</name> 1</father><!--就是这儿--> </department> <department><id>10</id> <name>111111</name> <father>1</father> </department> <department><id>16</id> <name>jrx</name> <father>10</father> </department> <department><id>17</id> <name>hhhhh</name> <father>10</father> </department> <count>9</count> </departmentlist> </body> </package>
本来是用普通的socket输入流开了个线程接收报文的,一切正常,后来改用MINA框架,出了这个问题。其他部分应该都没错,问题应该就出在解码器上,请大家帮忙看下,感激不尽!
2012年11月05日 18:12
目前还没有答案
相关推荐
Apache Mina是一个开源的网络通信应用框架,主要应用于Java平台,它为高性能、高可用性的网络应用程序提供了基础架构。在本文中,我们将深入探讨Mina的高级使用,特别是在文件图片传送、文件发送、XML和JSON报文处理...
总结起来,"mina学习基础-入门实例-传输定长报文(三)"主要涵盖了如何使用Apache Mina框架实现定长报文的SSL加密传输。这个过程涉及到了Mina的Server创建、过滤器链构建、编码解码器设计以及事件驱动模型的运用。通过...
在mina框架中,编解码器(Codec)扮演着至关重要的角色,它负责将应用层的数据转换为网络传输的字节流,以及将接收到的字节流还原为应用程序可以理解的对象。对于初学者来说,理解和编写自定义的编解码器可能会遇到...
Java Mina2是一个高度可扩展且高性能的网络通信框架,主要用在开发基于TCP、UDP等协议的服务端应用。它提供了简单而强大的API,使得开发者能够轻松构建网络应用程序,如服务器端的聊天室、游戏服务器或者任何需要...
在MINA框架中,CumulativeProtocolDecoder是一个关键的解码器组件,它在处理网络数据流时扮演着重要角色。本文将深入探讨CumulativeProtocolDecoder的使用及其背后的原理。 CumulativeProtocolDecoder的设计目标是...
Socket通讯和MINA应用是Java网络编程中的两个关键概念,它们在开发分布式系统、网络服务和客户端应用程序中扮演着重要角色。这篇博文将深入探讨这两个主题,并通过一个名为"testMina"的压缩包文件来展示实际应用。 ...
Mina(全称:Java Apache MINA,即Multipurpose Infrastructure for Network Applications)是一个高性能、异步事件驱动的网络应用程序框架,主要用于简化开发高质量的面向服务的架构(SOA)和网络应用程序。...
- **Decoder**:接收到 `IoBuffer`(字节缓冲区)后,Decoder 会按照预定义的格式(例如报文结构)读取数据,然后根据功能代码解析出具体的业务信息。在解析过程中,可能需要利用框架(如 XStream)将 XML 字符串...