mina codec 防止粘包
我在头部 和尾部都插有字符,类似 大小端
package com.baoy.code; import org.apache.mina.core.session.IoSession; import org.apache.mina.filter.codec.ProtocolCodecFactory; import org.apache.mina.filter.codec.ProtocolDecoder; import org.apache.mina.filter.codec.ProtocolEncoder; /** * * @author baoyou E-mail:curiousby@163.com * @version 2017年4月21日 上午10:35:05 * desc: */ public class CodecFactory implements ProtocolCodecFactory { private static ProtocolEncoder encoder = new CodeProtocolEncoder(); private static ProtocolDecoder decoder = new CodeProtocolDecoder(); @Override public ProtocolEncoder getEncoder(IoSession ioSession) throws Exception { return encoder; } @Override public ProtocolDecoder getDecoder(IoSession ioSession) throws Exception { return decoder; } }
package com.baoy.code; import org.apache.mina.core.buffer.IoBuffer; import org.apache.mina.core.session.IoSession; import org.apache.mina.filter.codec.CumulativeProtocolDecoder; import org.apache.mina.filter.codec.ProtocolDecoderOutput; /** * * @author baoyou E-mail:curiousby@163.com * @version 2017年4月21日 上午10:35:14 * desc: */ public class CodeProtocolDecoder extends CumulativeProtocolDecoder { @Override protected boolean doDecode(IoSession ioSession, IoBuffer in, ProtocolDecoderOutput out) throws Exception { while (in.remaining() >= 4) { in.mark(); byte[] sign = new byte[1]; in.get(sign, 0, 1); if (sign[0] != (byte) 0xF0 ) { throw new Exception("Bad package header, need 0xF0"); } byte[] lenBytes = new byte[2]; in.get(lenBytes, 0, 2); short length = CodeProtocolDecoder.getShort(lenBytes, 0); if (length > in.remaining()) { in.reset(); return false; } byte[] buffer = new byte[length]; in.get(buffer, 0, length); String msg = new String(buffer,"UTF-8"); byte[] sign2 = new byte[1]; in.get(sign2, 0, 1); if (sign2[0] != (byte) 0x80 ) { throw new Exception("Bad package tail, need 0x80"); } out.write(msg); } return false; } public static short getShort(byte[] buff, int pos) throws Exception { if (pos > buff.length - 2 || pos < 0) throw new Exception("Socket buffer Overflow"); int num = 0; for (int ix = 0; ix < 2; ++ix) { num <<= 8; num |= (buff[pos + ix] & 0xff); } return (short) num; } }
package com.baoy.code; import org.apache.mina.core.buffer.IoBuffer; import org.apache.mina.core.session.IoSession; import org.apache.mina.filter.codec.ProtocolEncoder; import org.apache.mina.filter.codec.ProtocolEncoderOutput; /** * * @author baoyou E-mail:curiousby@163.com * @version 2017年4月21日 上午10:35:19 * desc: */ public class CodeProtocolEncoder implements ProtocolEncoder { @Override public void encode(IoSession ioSession, Object msg, ProtocolEncoderOutput out) throws Exception { byte[] bytes =((String)msg).getBytes("UTF-8"); IoBuffer buffer = IoBuffer.allocate(bytes.length + 4, false); buffer.put((byte) 0xF0); buffer.put((byte) (bytes.length >> 8)); buffer.put((byte) (bytes.length)); buffer.put(bytes, 0, bytes.length); buffer.put((byte) 0x80); buffer.flip(); out.write(buffer); } @Override public void dispose(IoSession ioSession) throws Exception { } }
捐助开发者
在兴趣的驱动下,写一个免费
的东西,有欣喜,也还有汗水,希望你喜欢我的作品,同时也能支持一下。 当然,有钱捧个钱场(支持支付宝和微信捐助,加入it技术扣扣群),没钱捧个人场,谢谢各位。
谢谢您的赞助,我会做的更好!
相关推荐
本文将深入探讨“mina断包”和“粘包”问题,以及如何通过提供的mina_optimize代码解决这些问题。 首先,我们要理解什么是“断包”和“粘包”。在TCP/IP通信中,数据通常会被拆分成多个数据段进行传输,这在传输...
本实例主要关注的是Mina在处理网络通信时遇到的两个常见问题——“断包”和“粘包”。 1. **断包**: 当数据在网络中传输时,可能会因为各种原因(如网络拥塞、数据包大小限制等)被分割成多个部分,这些部分在...
mina 协议 解包 粘包
NULL 博文链接:https://jean7155.iteye.com/blog/1954890
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-integration-ognl-2.0.0-M6.jar mina-integration-...
综上所述,SpringBoot与Mina的结合,使我们能够方便地在Java应用程序中实现串口通信,解决粘包和断包问题,同时可能借助WebSocket实现与Web客户端的交互。"treatment_serial_service"作为核心组件,是串口通信功能的...
import org.apache.mina.filter.codec.textline.TextLineCodecFactory; import org.apache.mina.transport.socket.nio.NioSocketAcceptor; public class MinaServer { public static void main(String[] args) ...
处理Bytes粘包、半包、断包(ByteArrayDecoder),需配置自己的首尾标识符, 如果与首尾标识符相同的数据出现在首尾标识符以内的范围,建议将该数据进行转义, 如这样配置转义规则(假设首尾标识符是0x7e): 0x7e = 0x...
Apache Mina是一个开源的网络通信应用框架,主要应用于Java平台,它为高性能、高可用性的网络应用程序提供了基础架构。在本文中,我们将深入探讨Mina的高级使用,特别是在文件图片传送、文件发送、XML和JSON报文处理...
Apache Mina是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。这个"apache-mina-2.0.4.rar"压缩包包含的是Apache Mina 2.0.4版本的源代码,是深入理解和定制Mina的...
心跳机制是保持连接活性的重要手段,特别是在长连接中,防止因网络延迟或服务器无响应导致的假死状态。Mina允许开发者自定义心跳包,通过发送无数据的包或者包含特定标识的数据包,来检查网络连接是否正常。心跳通常...
MINA (Java IO Network Application Framework) 是一个由Apache软件基金会开发的开源网络通信框架,主要应用于构建高性能、高可用性的网络服务器。这个压缩包包含了MINA API文档、自学手册以及开发指南,对于学习和...
在mina框架中,编解码器(Codec)扮演着至关重要的角色,它负责将应用层的数据转换为网络传输的字节流,以及将接收到的字节流还原为应用程序可以理解的对象。对于初学者来说,理解和编写自定义的编解码器可能会遇到...
import org.apache.mina.filter.codec.textline.TextLineCodecFactory; import org.apache.mina.transport.socket.nio.NioSocketAcceptor; public class EchoServer { private IoAcceptor acceptor = new ...
通常,心跳机制用于检测连接是否仍然有效,防止因网络问题导致的假死连接。开发者可以通过设置`ReadTimeout`或自定义心跳消息来实现这一功能。 此外,Mina支持多种编码和解码器,如LineDelimiterFilter(按行分割...
4. **Protocol Codec**:编码和解码是网络通信中的重要环节,Mina提供了ProtocolCodec接口,允许开发者自定义协议的编码和解码规则。 5. **服务端与客户端构建**:学习如何使用Mina API创建服务端和客户端,监听...
mina新手案例,mina新手教程源码 mina+springboot最简单的案例。用的IDEA * mina服务端 * 1、添加@Controller注解和 @PostConstruct注解,代表启动springboot项目时也调用该类下的该方法, * 启动springboot项目...
标题中的“给予mina协议进行大数据传输”指的是一种基于Java的网络通信框架——Apache MINA(Model-View-Controller for Network Applications)。MINA是Apache软件基金会的一个项目,它提供了一个高度可扩展和高...
- **心跳机制**:为了检测连接是否断开,通常需要设置心跳包,定时发送和接收,防止连接因长时间无数据传输而被网络中间设备关闭。 - **线程安全**:在多线程环境下,需确保所有操作都是线程安全的,避免并发问题。...
Java SpringBoot 整合Mina框架,涉及到的核心技术主要包括Java NIO(非阻塞I/O)、Mina框架以及SpringBoot的集成应用。本教程旨在帮助开发者深入理解和掌握这些技术,并提供了一个可直接使用的基础平台框架。 Java ...