`
yznxing
  • 浏览: 369977 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

用mina网络传输使用ObjectSerializationCodecFactory一个小注意点

    博客分类:
  • java
阅读更多

背景:

 

之前的 一篇介绍mina的博客中,提到通过mina来传输文件的demo,

 

具体的demo地址在这:

 

http://guoliangqi.iteye.com/blog/628063

 

当时的评论回复里面,有一个同学说用我的这个demo传输图片特别慢,是特别慢,不是慢。

我当时没在意就随手回了下,说nio对于传输这种单文件的优势并不明显。

 

但是我重新运行了这段代码,传输一个大概52K的图片的时候,真的很慢,差不多要30秒才传完,

当时我就震惊了,绝对是哪个地方不对导致的。于是就开始了一段找问题之路。

 

如果有兴趣看解决的过程的,可以看前面几个步骤,没兴趣的直接看最后的【正解&原因分析】吧

解决问题:

【算了,我自己都懒得写这个过程了!】

 

步骤一:

 

步骤二:

 

正解&原因分析:

问题出在使用的ObjectSerializationCodecFactory上,打开ObjectSerializationCodecFactory的源码,

 

查看在其编码的一段代码是这样写的。

 

 

public void encode(IoSession session, Object message,
            ProtocolEncoderOutput out) throws Exception {
        if (!(message instanceof Serializable)) {
            throw new NotSerializableException();
        }


        //主要是这里
        IoBuffer buf = IoBuffer.allocate(64);


        buf.setAutoExpand(true);
        buf.putObject(message);

        int objectSize = buf.position() - 4;
        if (objectSize > maxObjectSize) {
            throw new IllegalArgumentException(
                    "The encoded object is too big: " + objectSize + " (> "
                            + maxObjectSize + ')');
        }

        buf.flip();
        out.write(buf);
    }

 

 

可以看到这里,默认是用64bit来进行数据的解码,

 

而我的demo里面传输文件,用的是:

 

byte[] a = new byte[1024 * 4];  

 

很明显,这个要比默认的那个64b长很多,导致内部需要进行频繁的操作之后,才能发送出去。

 

 

看到了这里,就修改了下以前用来传输的代码。

 

byte[] a = new byte[64];

 

然后再运行这个传输文件的demo,瞬间传输完。问题解决!

 

 

扩展:

后来看了下mina官方手册的,遇到这种问题,如果还需要传输大的字节数据,肯定不能用默认的这个ObjectSerializationCodecFactory来传输了,要么自己写一个继承他,修改下对应的decode方法,

要么自己来定义传输结构,重新进行codec的编写。

 

想要自己编写codec,可以参考这里:

 

http://mina.apache.org/tutorial-on-protocolcodecfilter-for-mina-2x.html

 

 

 

分享到:
评论
3 楼 yznxing 2014-02-13  
hao2181 写道
这个真扯 a是用来读文件字节数组 跟内部writer有什么关系呢


说的是 byte的长度对发送效率的影响。。。。
2 楼 hao2181 2014-01-11  
这个真扯 a是用来读文件字节数组 跟内部writer有什么关系呢
1 楼 q1241312 2012-10-23  
哪有,我在本机上试了,传4.27MB的文件,1024 * 4 明显比 64 快。

相关推荐

    Mina网络通信传输

    Mina网络通信传输是基于Java开发的一个高性能、可伸缩的网络应用框架,常用于构建服务器和客户端之间的通信系统,尤其适用于即时聊天应用。Mina提供了丰富的API和工具,简化了网络编程的复杂性,使得开发者可以专注...

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

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

    给予mina 协议进行大数据传输

    MINA是Apache软件基金会的一个项目,它提供了一个高度可扩展和高性能的网络应用开发框架,适用于多种传输协议,如TCP/IP和UDP/IP,以及SSL/TLS加密。在大数据传输场景中,MINA因其非阻塞I/O模型而被广泛采用,能够...

    mina文件传输

    Mina(MINA,全称Java Minimal Asynchronous Network Library)是一个用Java开发的网络通信框架,主要用于简化网络应用的开发,尤其是TCP和UDP协议的应用。它提供了高度抽象的API,使得开发者可以更专注于业务逻辑,...

    mina传输对象的示例

    Apache Mina是一个开源的Java框架,主要用于简化网络应用开发,特别是TCP/IP和UDP协议的应用。在标题和描述中提到的“mina传输对象的示例”指的是如何在Mina框架下处理和传输自定义的数据对象。Mina允许开发者通过...

    mina 集成spring 传输文件和文本

    通过以上这些知识点的深入理解和实践,你可以成功地将Mina与Spring集成,构建一个能够同时处理文件和文本传输的服务。这个过程涉及到了网络通信、协议设计、框架集成等多个层面,对提升你的Java网络编程能力大有裨益...

    Mina文件及字符串传输

    在IT行业中,Apache Mina是一个广泛使用的开源框架,主要用于创建高性能、高效率的网络应用程序。Mina提供了一种抽象层,使得开发者可以专注于业务逻辑,而不是底层的网络通信细节。本话题将深入探讨如何利用Mina...

    mina网络通信实例

    MINA(Multipurpose Infrastructure for Network Applications)是Apache软件基金会的一个开源项目,它提供了一个高度可扩展且跨平台的网络应用程序框架,主要用于简化开发高性能和高可用性的网络服务器和客户端。...

    SWT采用mina网络框架做聊天系统

    总结起来,使用SWT和Mina构建聊天系统是一个结合了GUI设计、网络通信和事件处理的综合实践。这个过程需要对SWT组件的使用有深入理解,同时也要掌握Mina的事件驱动模型和非阻塞I/O机制。通过这样的项目,开发者可以...

    apache-mina-2.0.4.rar_apache mina_mina

    Apache Mina是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。这个"apache-mina-2.0.4.rar"压缩包包含的是Apache Mina 2.0.4版本的源代码,是深入理解和定制Mina的...

    mina连接 mina心跳连接 mina断线重连

    Apache Mina是一个开源的网络通信框架,常用于构建高性能、高效率的服务端应用程序,尤其在Java平台上。在本文中,我们将深入探讨Mina的核心概念,包括连接管理、心跳机制以及断线重连策略。 首先,让我们理解"Mina...

    mina框架的使用

    在描述中提到的"mina简单事例"博客文章,作者可能详细解释了如何使用MINA框架创建一个简单的网络应用。通常,这样的示例会包含以下步骤: 1. **设置项目**: 创建一个新的Java项目,并引入MINA的依赖库。 2. **创建...

    mina apach 网络通信框架高性能例子

    Apache MINA(Multipurpose Infrastructure for Network Applications)是一个高级网络通信框架,主要针对Java平台设计,提供了高度可扩展和高性能的网络应用开发环境。MINA旨在简化网络编程,特别是对于TCP/IP和UDP...

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

    Apache Mina是一个开源的Java框架,专门用于构建高性能、高可扩展性的网络应用程序。它提供了一个事件驱动的网络通信模型,使得开发者可以更方便地处理网络协议和I/O操作。在"mina学习基础-入门实例-传输定长报文(三...

    MINA网络通信框架.pdf

    Apache MINA是一个强大的网络通信框架,专为构建高性能和高可扩展性的网络应用程序设计。它基于事件驱动和异步模型,支持多种传输协议,如TCP/IP、UDP/IP、串口通信以及虚拟机内部的管道。MINA的核心理念是将网络...

    mina使用例子

    通过这个"mina使用例子",你可以深入理解如何使用Mina来构建一个网络应用,从创建服务端、配置过滤器链,到处理客户端的连接和数据交换,以及如何进行性能优化和异常处理。这个例子将为你提供实践Mina框架的第一手...

    mina网络编程框架

    mina网络编程框架,mina网络编程框架是你的网络编程更简单,我使用mina写了一个接口,还可以。如果有不明白的可以给我发邮件3864913429@163.com. qq:270445938

    Mina小Demo聊天工具

    总结来说,Mina小Demo是一款结合了Mina的强大网络通信能力与Swing易用界面的示例应用,对于Java开发者来说,无论是学习网络编程还是GUI设计,都是一个很好的实践案例。通过深入研究其源码,我们可以更深入地理解Java...

    高性能网络架构Mina框架 下载

    Mina(Multithreaded Internet Network Application)框架是由Apache软件基金会提供的一个高性能、可伸缩的网络编程框架,它主要应用于Java NIO环境下的网络通信开发。Mina通过采用多线程模型和异步I/O技术来提高...

    MINA_API+MINA_DOC+mina

    MINA (Java IO Network Application Framework) 是一个由Apache软件基金会开发的开源网络通信框架,主要应用于构建高性能、高可用性的网络服务器。这个压缩包包含了MINA API文档、自学手册以及开发指南,对于学习和...

Global site tag (gtag.js) - Google Analytics