0 0

关于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
目前还没有答案

相关推荐

    mina的高级使用,mina文件图片传送,mina发送文件,mina报文处理,mina发送xml和json

    Apache Mina是一个开源的网络通信应用框架,主要应用于Java平台,它为高性能、高可用性的网络应用程序提供了基础架构。在本文中,我们将深入探讨Mina的高级使用,特别是在文件图片传送、文件发送、XML和JSON报文处理...

    mina学习基础-入门实例-传输定长报文(三)

    总结起来,"mina学习基础-入门实例-传输定长报文(三)"主要涵盖了如何使用Apache Mina框架实现定长报文的SSL加密传输。这个过程涉及到了Mina的Server创建、过滤器链构建、编码解码器设计以及事件驱动模型的运用。通过...

    mina自定义编解码器详解

    在mina框架中,编解码器(Codec)扮演着至关重要的角色,它负责将应用层的数据转换为网络传输的字节流,以及将接收到的字节流还原为应用程序可以理解的对象。对于初学者来说,理解和编写自定义的编解码器可能会遇到...

    Java mina2源码

    Java Mina2是一个高度可扩展且高性能的网络通信框架,主要用在开发基于TCP、UDP等协议的服务端应用。它提供了简单而强大的API,使得开发者能够轻松构建网络应用程序,如服务器端的聊天室、游戏服务器或者任何需要...

    MINA使用札记(CumulativeProtocolDecoder使用)

    在MINA框架中,CumulativeProtocolDecoder是一个关键的解码器组件,它在处理网络数据流时扮演着重要角色。本文将深入探讨CumulativeProtocolDecoder的使用及其背后的原理。 CumulativeProtocolDecoder的设计目标是...

    socket通讯和mina应用

    Socket通讯和MINA应用是Java网络编程中的两个关键概念,它们在开发分布式系统、网络服务和客户端应用程序中扮演着重要角色。这篇博文将深入探讨这两个主题,并通过一个名为"testMina"的压缩包文件来展示实际应用。 ...

    mina TCP Server

    Mina(全称:Java Apache MINA,即Multipurpose Infrastructure for Network Applications)是一个高性能、异步事件驱动的网络应用程序框架,主要用于简化开发高质量的面向服务的架构(SOA)和网络应用程序。...

    mina程序执行过程

    - **Decoder**:接收到 `IoBuffer`(字节缓冲区)后,Decoder 会按照预定义的格式(例如报文结构)读取数据,然后根据功能代码解析出具体的业务信息。在解析过程中,可能需要利用框架(如 XStream)将 XML 字符串...

Global site tag (gtag.js) - Google Analytics