`
spark8090
  • 浏览: 3271 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

mina

阅读更多
使用mina传输超过2k以上的数据时(采用tcp方式,如果是UDP方式,好像一次传输的数据不能超过256字节,如果超过mina不会分批次发送,而tcp方式会分批次发送),mina会自动将这些数据分成多次发送。由于是分批次发送数据,所有客服端在接受数据时,需要等所有的数据接受完之后才能解码,否则无法解码,或者只能读取到部分文件。
以下是一个发送、接受大字节数组的主要代码
服务端向客服端发送字节数组
服务端代码:
编码器:
public class ImageDataEncoder extends ProtocolEncoderAdapter {
@Override
public void encode(IoSession session, Object message,
   ProtocolEncoderOutput out) throws Exception {
  CharsetEncoder charset = Charset.forName("UTF-8").newEncoder();
  ImageData image = (ImageData) message;
  IoBuffer buffer = IoBuffer.allocate(2048).setAutoExpand(true);
  buffer.putString(image.getYh(), charset);// 发送数据类型
  buffer.putInt(image.getLength());// 发送字节数组的总长度,共解码时使用
  buffer.put(image.getBimage());// 发送字节数据
  buffer.flip();
  out.write(buffer);
  buffer.free();
}
}

ImageData.java
public class ImageData {
private static final long serialVersionUID = 1L;
private String yh = YHConstants.YH_IMG;// 数据类型
public int length = 0;// 字节数组长度
private byte[] bimage;// 待发送的字节数组
private BufferedImage image;//将字节数组转换成图片文件
public ImageData() {
}
public ImageData(byte[] bimage) {
  this.bimage = bimage;
}
public byte[] getBimage() {
  return bimage;
}
public BufferedImage getImage() {
  try {
   if (bimage.length > 0) {
    ByteArrayInputStream in = new ByteArrayInputStream(bimage);
    this.image = ImageIO.read(in);
    in.close();
   }
  } catch (RemoteException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
  return this.image;
}
public int getLength() {
  return bimage.length;
}
public String getYh() {
  return yh;
}
public void setBimage(byte[] bimage) {
  this.bimage = bimage;
}
public void setYh(String yh) {
  this.yh = yh;
}
}
YHConstants.java
public class YHConstants {
public static final int LENGTH = 7;// 命令数据类型
public static final String YH_CMD = "YH CMD ";// 命令数据类型
public static final String YH_IMG = "YH IMG ";// 图片数据类型
}
客服端:
解码器:分段发送的解码器一定要继承CumulativeProtocolDecoder ,这个是专门用来实现这种解码的
package com.seara.socket.codec;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.session.AttributeKey;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.CumulativeProtocolDecoder;
import org.apache.mina.filter.codec.ProtocolDecoderOutput;
import com.seara.socket.message.ImageData;
import com.seara.socket.message.YHConstants;
/**
* 接收图片数据,由于图片数据比较大,tcp是采用分段式发送,所有需要等所有数据接收完之后才能解码
*
* 解码原理:首先读取服务器端发送数据的总长度length,然后与当前的buff中的数据长度matchLength比较,如果matchLength>=
* length则认为数据发送完毕, 否則将当前的buff保存起来,在下次发送buff之时合并为一个buff,然后在按照以上条件判断
*
* @author seara
*
*/
public class ImageDataDecoder extends CumulativeProtocolDecoder {
private final AttributeKey CONTEXT = new AttributeKey(this.getClass(),
   "context");
@Override
protected boolean doDecode(IoSession session, IoBuffer buff,
   ProtocolDecoderOutput out) throws Exception {
  CharsetDecoder charset = Charset.forName("UTF-8").newDecoder();
  System.out.println("继续解码......." + buff.remaining());
  // 取出context
  Context ctx = this.getContext(session);// 将contex从session中取出
  int length = ctx.getLength();// 数据总长度
  IoBuffer buffer = ctx.getBuffer();// 保存数据的buffer
  int matchLength = ctx.getMatchLength();// 目前已经发送的数据的总长度
  if (0 == length) {// 第一次取值
   String yh = buff.getString(YHConstants.LENGTH, charset);
   length = buff.getInt();
   matchLength = buff.remaining();
   ctx.setYh(yh);
   ctx.setLength(length);
  } else {
   matchLength += buff.remaining();
  }
  ctx.setMatchLength(matchLength);
  if (buff.hasRemaining()) {// 如果buff中还有数据
   buffer.put(buff);// 添加到保存数据的buffer中
   if (matchLength >= length) {// 如果已经发送的数据的长度>=目标数据的长度,则进行解码
    byte[] b = new byte[length];
    // 一定要添加以下这一段,否则不会有任何数据,因为,在执行buffer.put(buff)时buffer的起始位置已经移动到最后,所有需要将buffer的起始位置移动到最开始
    buffer.flip();
    buffer.get(b);
    ImageData image = new ImageData(b);
    out.write(image);
    System.out.println("解码完成.......");
    return true;
   } else {
    ctx.setBuffer(buffer);
   }
  }
  return false;// 返回false时,解码器就不会执行解码,返回true是在解码完成
}
/**
  * 定义一个内部类,用来封转当前解码器中的一些公共数据,主要是用于大数据解析
  *
  * @author seara
  *
  */
public class Context {
  public IoBuffer buffer;
  public int length = 0;
  public int matchLength = 0;
  public String yh = "";
  public Context() {
   this.buffer = IoBuffer.allocate(1024).setAutoExpand(true);
  }
  public int getMatchLength() {
   return matchLength;
  }
  public void setMatchLength(int matchLength) {
   this.matchLength = matchLength;
  }
  public IoBuffer getBuffer() {
   return buffer;
  }
  public void setBuffer(IoBuffer buffer) {
   this.buffer = buffer;
  }
  public int getLength() {
   return length;
  }
  public void setLength(int length) {
   this.length = length;
  }
  public String getYh() {
   return yh;
  }
  public void setYh(String yh) {
   this.yh = yh;
  }
}
public Context getContext(IoSession session) {
  Context ctx = (Context) session.getAttribute(CONTEXT);
  if (ctx == null) {
   ctx = new Context();
   session.setAttribute(CONTEXT, ctx);
  }
  return ctx;
}
}[/size][size=x-small][align=left][/align][color=green][/color]
分享到:
评论

相关推荐

    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发送文件,mina报文处理,mina发送xml和json

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

    Mina+Socket通信

    Mina和Socket是两种常见的网络通信框架和技术,它们在Java编程环境中被广泛使用。本篇文章将深入探讨如何使用Mina与Socket实现通信,并提供客户端和服务端的实现代码概述。 Mina(全称“MINA: Minimalistic ...

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

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

    mina自定义编解码器详解

    **mina自定义编解码器详解** mina是一个Java开发的网络通信框架,广泛应用于TCP和UDP协议的服务器和客户端开发。在mina框架中,编解码器(Codec)扮演着至关重要的角色,它负责将应用层的数据转换为网络传输的字节...

    Java springboot 整合mina 框架,nio通讯基础教程,mina框架基础教程.zip

    Java SpringBoot 整合Mina框架,涉及到的核心技术主要包括Java NIO(非阻塞I/O)、Mina框架以及SpringBoot的集成应用。本教程旨在帮助开发者深入理解和掌握这些技术,并提供了一个可直接使用的基础平台框架。 Java ...

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

    标题中的“给予mina协议进行大数据传输”指的是一种基于Java的网络通信框架——Apache MINA(Model-View-Controller for Network Applications)。MINA是Apache软件基金会的一个项目,它提供了一个高度可扩展和高...

    Mina开发实例(服务端、客户端)DEMO

    Apache Mina是一个高度可扩展的网络通信框架,它允许开发者创建高性能、高效率的服务端和客户端应用程序。在Java世界中,Mina以其简洁的API和灵活性而受到青睐,尤其适用于处理大量的并发连接,如TCP/IP和UDP协议。...

    springboot 深度整合mina开箱即用

    在本文中,我们将深入探讨如何将Spring Boot与Mina进行深度整合,以便为新手开发者提供一个开箱即用的解决方案。Spring Boot以其简洁的配置和快速的开发体验,已经成为Java领域中的主流微服务框架,而Mina则是一个...

    MINA_API+MINA_DOC+mina

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

    mina心跳包机制

    mina心跳包机制是Apache Mina框架中的一个关键特性,它用于维持网络连接的活跃状态,确保数据能够在客户端和服务端之间顺畅地传输。Mina是一个高度可扩展的Java网络应用框架,广泛应用于各种分布式系统和网络服务,...

    java-mina通信框架详解.docx

    Apache Mina是一个强大的网络通信框架,专为基于TCP/IP和UDP/IP协议栈的应用设计。它提供了JAVA对象的序列化和虚拟机内部通信的功能,使得开发者能够迅速构建高性能、高可扩展性的网络应用。Mina的核心特性是其事件...

    spring boot 整合mina 串口

    **Spring Boot 整合Mina实现串口通信详解** 在Java开发中,有时我们需要与硬件设备进行串口通信,例如读取传感器数据或控制工业设备。Spring Boot作为一款轻量级的框架,使得快速构建应用变得简单。而Mina则是一款...

    mina2.0 含11个jar包

    mina-core-2.0.0-M6.jar mina-example-2.0.0-M6.jar mina-filter-codec-netty-2.0.0-M6.jar mina-filter-compression-2.0.0-M6.jar mina-integration-beans-2.0.0-M6.jar mina-integration-jmx-2.0.0-M6.jar mina-...

    mina客户端简单代码示例

    Apache Mina是一个开源的网络通信框架,主要用于简化Java应用程序与远程服务器之间的通信。它提供了高度可扩展和高性能的网络协议处理能力,支持多种传输层协议,如TCP/IP、UDP/IP和SSL/TLS等。在本示例中,我们关注...

    mina2.0全部jar包

    《mina2.0全部jar包详解》 Apache MINA(Multipurpose Infrastructure for Network Applications)是一个高性能、异步事件驱动的网络应用程序框架,主要用于简化开发Java网络应用,特别是那些基于TCP和UDP协议的...

    MINA断线重连死锁解决

    在IT行业中,网络通信是不可或缺的一部分,而Apache MINA(Model-Independent Network Application Framework)是一个高性能、异步的网络应用程序框架,广泛应用于TCP/IP和UDP协议的开发。当我们遇到"MINA断线重连...

    MINA2.0用户手册中文随笔翻译

    MINA2.0 用户手册中文随笔翻译 MINA 是一个基于 NIO(Non-Blocking I/O)的网络框架,提供了统一的接口来处理 TCP、UDP 和其他机制的通信。MINA 的主要特点是能够处理大量的 socket 连接,并提供了一个高层接口来...

    Android-MinaSocket一款基于Mina的Socket长连接库

    **Android-MinaSocket:基于Mina的高效Socket长连接库** 在移动应用开发中,尤其是Android平台,实时性与稳定性是许多应用场景的核心需求,比如在线游戏、即时通讯、物联网设备等。在这种背景下,使用Socket进行长...

    Mina2.0.7原代码,去掉slf4j代码

    Apache Mina是一个高度可扩展的网络通信框架,用于构建高性能、高效率的网络应用程序,如服务器和客户端。在"MINA 2.0.7原代码,去掉slf4j代码"这个项目中,我们可以看到Mina的核心组件mina_core_2.0.7已经被剥离了...

Global site tag (gtag.js) - Google Analytics