背景:使用mina进行socket编程,而传输数据大小会出现比较大的变化时,出现的BufferUnderflowException问题。
异常如下所示:
org.apache.mina.filter.codec.ProtocolDecoderException: org.apache.mina.core.buffer.BufferDataException: java.io.UTFDataFormatException (Hexdump: 00 00 73 72 01 00 13 6A 61 76 61 2E 75 74 69 6C 2E 41 72 72 61 79 4C 69 73 74 78 70 00 00 00 07 77 04 00 00 00 0A 73 71 00 7E 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 15 C9 00 00 00 00 00 00 00 6D 00 00 00 B8 00 00 00 00 00 00 00 00 00 00 00 C8 00 00 00 00 00 00 00 00 70 70 74 00 36 68 74 74 70 3A 2F 2F 6D 2E 62 61 69 64 75 2E 63 6F 6D 2F 73 74 61 74 69 63 2F 69 6E 64 65 78 2F 66 61 76 69 63 6F 6E 2D 35 37 2E 70 6E 67 3F 74 6A 3D 69 63 6F 6E 73 71 00 7E 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3E 00 00 00 00 00 00 00 00 00 00 00 03 A1 00 00 00 00 00 00 00 00 00 00 00 A7 00 00 00 00 00 00 00 10 00 00 00 C8 00 00 00 00 00 00 00 00 70 70 74 00 25 68 74 74 70 3A 2F 2F 6D 2E 62 61 69 64 75 2E 63 6F 6D 2F 73 74 61 74 69 63 2F 69 6E 64 65 78 2F 69 2E 67 69 66 73 71 00 7E 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 4E 00 00 00 00 00 00 00 00 00 00 00 00 98 00 00 00 00 00 00 00 00 00 00 00 A6 00 00 00 00 00 00 00 00 00 00 00 C8 00 00 00 00 00 00 00 00 70 70 74 00 24 68 74 74 70 3A 2F 2F 6D 2E 62 61 69 64 75 2E 63 6F 6D 2F 73 74 61 74 69 63 2F 68 62 2F 68 6F 74 2E 67 69 66 73 71 00 7E 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 4E 00 00 00 00 00 00 00 00 00 00 00 0B E3 00 00 00 00 00 00 00 00 00 00 00 A8 00 00 00 00 00 00 00 00 00 00 00 C8 00 00 00 00 00 00 00 00 70 70 74 00 26 68 74 74 70 3A 2F 2F 6D 2E 62 61 69 64 75 2E 63 6F 6D 2F 73 74 61 74 69 63 2F 69 6E 64 65 78 2F 70 31 2E 70 6E 67 73 71 00 7E 00)
at org.apache.mina.filter.codec.ProtocolCodecFilter.messageReceived(ProtocolCodecFilter.java:251)
at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:434)
at org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1200(DefaultIoFilterChain.java:46)
at org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:796)
at org.apache.mina.filter.logging.LoggingFilter.messageReceived(LoggingFilter.java:177)
at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:434)
at org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1200(DefaultIoFilterChain.java:46)
at org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:796)
at org.apache.mina.core.filterchain.IoFilterEvent.fire(IoFilterEvent.java:75)
at org.apache.mina.core.session.IoEvent.run(IoEvent.java:63)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
原因:mina框架生成TransportMetadata对象时,DefaultTransportMetadata的构造方法中有一个参数为fragmentation,boolean类型,分片标志。当设置为true时,会出现分包情况。而在未通过断包与粘包处理情况下,由于分包,最后数据不完整,从而导致异常。
框架处理原理分析:可以根据实际情况,设置buffersize的大小,让buffersize处在平均略高的状态下工作,节省由于初始设置过大,而浪费内存。
解决方案:
1,最简单的修改框架原码。将其中的NioSocketSession类重写即可,里面有TransportMetadata创建的地方修改。
2,通过对断包或粘包的处理。(网上已有相关的博客:http://blianchen.blog.163.com/blog/static/1310562992010101891522100/)
分享到:
相关推荐
Java SpringBoot 整合Mina框架,涉及到的核心技术主要包括Java NIO(非阻塞I/O)、Mina框架以及SpringBoot的集成应用。本教程旨在帮助开发者深入理解和掌握这些技术,并提供了一个可直接使用的基础平台框架。 Java ...
《mina框架资源包详解——构建即时通讯服务器的关键组件》 Mina框架,全称为Apache Mina,是一款基于Java开发的网络通信应用框架,它提供了一种简单而高性能的方式来构建网络服务,尤其在处理TCP/IP、UDP/IP以及SSL...
- **健壮性**:内置了多种错误处理机制,确保应用程序能够在出现异常情况下正常运行。 #### 三、MiNA框架实践 在实际应用中,MiNA框架通常用于构建客户端和服务端的应用程序。以下是一些关于如何使用MiNA框架进行...
Mina框架是一个高性能、异步事件驱动的网络应用程序框架,主要用Java语言编写,用于简化开发TCP、UDP和SSL/TLS协议服务器和客户端的过程。它广泛应用于构建网络服务,如FTP、SMTP、NNTP等协议的服务器,以及任何基于...
例如,`messageReceived()`方法用于处理接收到的数据,而`exceptionCaught()`方法用于处理通信过程中出现的异常。此外,还有`sessionCreated()`和`sessionClosed()`等事件,分别对应于连接建立和关闭。 Mina的事件...
apache mina 框架的学习文档,通过此文档可以基本了解mina框架。
Java Mina框架是一款高度可扩展且高性能的网络应用开发框架,专为开发网络服务和协议处理应用程序而设计。它提供了一种简洁、高效的API,使得开发者可以轻松地创建基于TCP/IP和UDP/IP协议的服务器和客户端应用。Mina...
Apache Mina是一个高性能、异步事件驱动的网络应用程序框架,主要用在开发网络通信应用,如TCP/IP和UDP/IP协议的服务器和客户端。这个框架允许开发者以一种简单、高效的方式处理I/O操作,同时提供了丰富的功能,如多...
总结来说,Mina框架是一个强大的工具,用于构建高性能的网络服务,而SLF4J则提供了灵活的日志记录解决方案。通过下载的“Mina完整架包”,开发者可以获得所有必要的组件,开始创建自己的网络应用程序。
Mina框架是一个强大的网络应用开发框架,主要用于构建高性能、高可用性的网络服务器。在Java世界里,Mina因其异步事件驱动模型而受到广泛的青睐,它简化了TCP/IP和UDP协议编程,使得开发者可以专注于业务逻辑,而...
综上所述,MINA长连接框架在实现服务器与Android客户端通讯时,涉及到网络编程、数据传输协议、异常处理、过滤器机制、长连接维护等多个技术要点,开发者需要根据实际需求进行合理的架构设计和优化。通过MINA提供的...
Apache MINA(Multipurpose Infrastructure for Network Applications)是一个高性能、异步事件驱动的网络应用程序框架,主要用于简化开发高质量的网络服务。这个框架适用于多种协议,如TCP/IP和UDP/IP,以及NIO(非...
Mina框架是一个基于Java的网络通信应用框架,它为高性能、高可用性的网络应用程序提供了强大的支持。本教程将深入探讨Mina框架的入门与开发,帮助你快速掌握这个框架的关键概念和技术。 首先,理解Mina的核心概念至...
### 高性能网络架构Mina框架简介 #### 一、Mina框架概述 Mina(Multithreaded Internet Network Application)框架是由Apache软件基金会提供的一个高性能、可伸缩的网络编程框架,它主要应用于Java NIO环境下的...
mina 框架使用总结 mina 框架是对 Java 的 NIO 包的一个封装,简化了 NIO 程序开发的难度,封装了很多底层的细节,使开发者把精力集中到业务逻辑上来。下面是对 mina 框架使用的总结。 1. MINA 框架概述 MINA ...
总的来说,这个压缩包提供了一个基础的Mina框架环境,并结合了SLF4J作为日志解决方案,便于开发者构建网络应用。在使用过程中,根据项目的具体需求,可能还需要添加其他的依赖,例如Spring框架的集成,或者特定的...
Mina框架正是为解决这一难题而生,它通过异步I/O和事件驱动机制,极大地提升了网络应用程序的效率和性能。结合Java NIO(非阻塞I/O),Mina使得开发者能够更专注于业务逻辑设计,而不必深陷底层I/O和线程并发的复杂...
Apache Mina 框架是一个强大的网络通信应用框架,它主要针对基于TCP/IP和UDP/IP的协议栈,同时也支持Java对象序列化和其他通信方式。Mina 的核心设计目标是帮助开发者快速构建高性能、高可扩展性的网络应用。它采用...
MINA (Multipurpose Infrastructure for Network Applications) 是一个基于 Java 的网络应用框架,主要利用了 Java NIO (Non-blocking I/O) 技术。NIO 相比于传统的 BIo (Blocking I/O),提供了更高效的数据传输能力...