`
aa87963014
  • 浏览: 154373 次
  • 性别: Icon_minigender_1
  • 来自: 布尼塔尼亚
社区版块
存档分类
最新评论

mina 粘包无法解决的解决办法

 
阅读更多

如果你遇到”粘包“问题,实际上可能不是粘包问题。

 

使用mina的时候铺天盖地的都说要加上:ExecutorFilter

 

 

 

fc.addLast("executor",new ExecutorFilter(Executors.newCachedThreadPool()));

 

我在测试的时候发现很容易出现粘包问题,ok tcp出现粘包问题很普遍,但是,问题在于我使用的是TextLineCodecFactory

本身是按照\n 分隔符解析消息的,客户端发送消息也是由\n分割的。 完全没有道理出现什么鬼粘包问题。

 

mina封装得很好,大致上需要大家配置的就那么几个。主要是DefaultIoFilterChainBuilder的配置

 

ok,加上了上面写的ExecutorFilter,通过异步队列处理消息,提高性能。

 

问题就来了,在测试过程中,消息居然是乱的,也就是说出现了粘包问题。测试来测试去,想来想去都无法理解这是为什么。

最终注释掉测试:通过。

使用newFixedThreadPool 不通过

使用newSingleThreadExecutor 通过。

 

由此我得出一个结论:虽然粘包问题解决了,但是使用的ExecutorFilter是异步的,导致消息是被一段段的接收并且解析的。

那么,这些消息之间是异步的,对于单个消息的解析是完全没问题的。但是问题在于,收到字节的时候就已经把字节给分错了。

去掉异步的队列就解决了这个问题。

 

以上是没看过源码随口瞎说的,对这方面了解的朋友请交流下。

 

看来我还要多研究,我实在是搞不懂,解析字节也需要异步解析?如果不是因为异步解析字节导致字节分开。又怎么会出现我所描述的问题?

 

如果你遇到粘包问题又无法解决,请尝试下。

 

具体的需要多看下,倒是是什么鬼原因导致字节错乱

 

fuc.

 

----------------------

 

以上都说法都tmd有问题,

实际上我遇到的消息混乱的问题原因出自于一个:DefaultIoFilterChainBuilder 过滤器添加顺序问题。

 

 

我先添加的 ExecutorFilter 再添加的ProtocolCodecFilter 结果导致了异步接收消息后 解析消息。

就如上面所说,我一直奇怪的是为什么mina tmd 不先解析消息然后多线程异步处理消息。

原来这个地方的顺序还有一个 这么bug的要求。

 

虽然我知道 mina的logger放在前面和后面也是由不同的,但是无法理解这个狗日的顺序对mina有什么好处。

 

如果说,在ProtocolCodecFilter 使用order ExecutorFilter 在其后面再放一个 其他线程池?这样又有什么好处?

 

总之,如果你遇到一些奇怪的问题,注意过滤器添加顺序的问题!!!

先解码,后放入队列处理!!!

 

fuc. mina

 

 

 

2
1
分享到:
评论
1 楼 724615144 2013-08-08  
谢楼主,我也碰到这个问题了,找了半天,filter顺序换了后好了
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    mina 断包,粘包问题解决

    本文将深入探讨“mina断包”和“粘包”问题,以及如何通过提供的mina_optimize代码解决这些问题。 首先,我们要理解什么是“断包”和“粘包”。在TCP/IP通信中,数据通常会被拆分成多个数据段进行传输,这在传输...

    Mina断包,粘包处理(完整实例,有客户端,服务端)

    相反,“粘包”是指多个数据包在传输过程中合并成一个大的数据包,然后在接收端被一起读取,使得原本独立的数据包无法区分开。同样,这需要通过合适的解码器来解决,比如使用LengthFieldBasedFrameDecoder,它可以...

    mina 协议 解包 粘包

    mina 协议 解包 粘包

    springboot mina 串口对接

    综上所述,SpringBoot与Mina的结合,使我们能够方便地在Java应用程序中实现串口通信,解决粘包和断包问题,同时可能借助WebSocket实现与Web客户端的交互。"treatment_serial_service"作为核心组件,是串口通信功能的...

    mina4-android:Android TCP框架(基于MINA 2.0.0-M3)、增加Bytes工厂、无需依赖slf4j(新增Mina4Log打印输出日志), 处理Bytes粘包、半包、断包(ByteArrayDecoder)

    处理Bytes粘包、半包、断包(ByteArrayDecoder),需配置自己的首尾标识符, 如果与首尾标识符相同的数据出现在首尾标识符以内的范围,建议将该数据进行转义, 如这样配置转义规则(假设首尾标识符是0x7e): 0x7e = 0x...

    HPsocket 封包与mina对接

    ### HPsocket 封包与mina对接 #### 一、HPsocket概述 ...通过设置合适的包头标识、包体长度和缓冲区大小等参数,以及在Mina中正确配置过滤器和处理器,可以有效地解决断包、粘包等问题,实现稳定可靠的网络通信。

    Java视频教程 Java游戏服务器端开发 Netty NIO AIO Mina视频教程

    jaca视频教程 jaca游戏服务器端开发 Netty NIO AIO Mina视频教程 课程目录: 一、Netty快速入门教程 01、第一课NIO 02、第二课netty服务端 03、第三课netty客户端 04、第四课netty线程模型源码分析(一) 05、...

    Voovan开发手册

    - **起源**:Voovan项目起源于开发者在使用Netty和Mina框架过程中遇到的一些难点和困惑,尤其是关于粘包等问题的处理。这促使开发者进一步研究Java异步通信机制,并最终决定基于Java 1.7之后引入的AIO(Asynchronous...

    Java面试题10道Java高级必备的Netty面试题!.pdf

    - 如何处理粘包和拆包问题,以及如何选择合适的FrameDecoder? 6. **零拷贝** - 什么是零拷贝?Netty是如何实现零拷贝的? - 零拷贝在什么场景下能显著提高性能? 7. **心跳机制** - 在Netty中如何实现心跳...

    面向智能相机的远程异步图像数据处理服务.pdf

    为了解决这一问题,南京邮电大学的研究人员潘钺、胡健和孟庆琳提出了一种面向智能相机的远程异步图像数据处理服务,旨在通过服务器端对智能相机并发图像数据进行处理,并提供了一个整体的服务框架。 这项服务首先在...

    Java Netty-入门教程.pdf

    - 对常见的问题如粘包、半包现象提供了有效的解决方案。 - 避免了 epoll 空轮询导致的 CPU 资源浪费问题。 - 对 Java 标准库中的 API 进行了增强和优化,提高了使用的便利性和效率。 - **相比于其他网络应用框架*...

    Java Netty 分布式开发 框架

    Netty的组件和设计使其在分布式系统的网络通信中表现出色,比如处理消息分段、粘包和半包问题、心跳检测、重连机制等。它的扩展性允许开发者针对特定的业务需求开发插件。例如,在处理用户登录时,可以添加一个...

Global site tag (gtag.js) - Google Analytics