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

mina接收数据不全(2)

    博客分类:
  • mina
阅读更多

由apache mina建立的socket不管是采用TCP或是UDP,在Filter不添加codec选项的情况下,由IoHandlerAdapter派生的处理 handler 类中public void messageReceived(IoSession session, Object message){}函数里的message对象是IoBuffer的实例,如下:
@Override
    public void messageReceived(IoSession session, Object message)
            throws Exception {

        if (! (message instanceof IoBuffer)) {
              return;
           }

        IoBuffer rb = (IoBuffer) message;
        callback.messageReceived(java.nio.ByteBuffer.wrap(rb.array(), 0, rb.buf().limit()));
    }

另外提醒:
1、如果你使用mina建立一个socket添加了如下:
IoFilter CODEC_FILTER = new ProtocolCodecFilter(
                new TextLineCodecFactory());
connector(acceptor).getFilterChain().addLast("codec", CODEC_FILTER);
如果发送数据的socket不是同样的设置或者不是利用mina建立的socket则发送数据的时候需要在数据末尾添加‘\n’,以表示字符串结束。

2、 由于我们使用mina socket读取数据时通常都是采用其通知接收的方式,所以我们必须留心接收数据的完整性,如果你使用mina socket接收数据不完整,在确认自己接收处理代码无误后,请检查一下org\apache\mina\core\polling \AbstractPollingIoProcessor.java中的代码的如下红色部分:

private void read(T session) {
        IoSessionConfig config = session.getConfig();
        IoBuffer buf = IoBuffer.allocate(config.getReadBufferSize());

        final boolean hasFragmentation =
            session.getTransportMetadata().hasFragmentation();

        try {
            int readBytes = 0;
            int ret;

            try {
                if (hasFragmentation) {
                    while ((ret = read(session, buf)) > 0) {
                        readBytes += ret;
                        if (!buf.hasRemaining()) {
                            break;
                        }
                    }
                } else {
                    ret = read(session, buf);
                    if (ret > 0) {
                        readBytes = ret;
                    }
                }
            } finally {
                buf.flip();
            }

            if (readBytes > 0) {
                IoFilterChain filterChain = session.getFilterChain();
                filterChain.fireMessageReceived(buf);
                buf = null;

                if (hasFragmentation) {
                    if (readBytes << 1 < config.getReadBufferSize()) {
                        session.decreaseReadBufferSize();
                    } else if (readBytes == config.getReadBufferSize()) {
                        session.increaseReadBufferSize();
                    }
                }

            }
            if (ret < 0) {
                scheduleRemove(session);
            }
        } catch (Throwable e) {
            if (e instanceof IOException) {
                scheduleRemove(session);
            }
            IoFilterChain filterChain = session.getFilterChain();
            filterChain.fireExceptionCaught(e);
        }
    }

分享到:
评论
3 楼 howesen 2012-08-31  
断包与粘包问题,需要处理下就好了
2 楼 chxiaowu 2011-10-25  
即使这个修改了在大并发量的时候 还是会出现 数据接收不全的问题。  还是得自己在过滤器中写代码解决。
1 楼 xly1981 2010-08-20  
Mina 的 IoHandlerAdapter 接口似乎是 单例的,处理多个请求是否会有并发问题

相关推荐

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

    在压缩包子文件的文件名“M2M”中,通常M2M代表Machine-to-Machine通信,这可能是指使用MINA来实现设备之间的数据交换,例如在物联网(IoT)环境中。MINA的灵活性和可扩展性使得它适合于处理各种设备间的通信需求,...

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

    2. **Mina文件图片传送** 在Mina中,我们可以利用BufferedIoFilter或者IoBuffer来传输文件,包括图片。首先,我们需要将图片文件读取到内存中的IoBuffer,然后通过过滤器链传递给远程客户端。在这个过程中,可以...

    spring boot 整合mina 串口

    为了测试,你可以使用串口调试工具(如RealTerm、CoolTerm等)连接到同一串口,发送和接收数据。 以上就是Spring Boot整合Mina实现串口通信的基本步骤。这个例子中,我们创建了一个可直接运行的Spring Boot项目,...

    MINA:开始接受数据

    NULL 博文链接:https://summerbell.iteye.com/blog/359201

    Android Mina UDP数据交互

    本文将深入探讨如何使用Mina库在Android客户端与Java服务器之间实现UDP(用户数据报协议)的数据交互。 UDP是一种无连接的、不可靠的传输层协议,相比TCP,它具有更低的延迟和更高的数据传输效率。然而,由于其不...

    mina串口通讯

    3. **定义处理器**:编写一个实现了`IoHandler`接口的类,处理接收到的数据和发送的数据。 4. **监听事件**:在处理器中,我们需要重写`sessionCreated()`、`messageReceived()`和`messageSent()`等方法,以响应...

    mina的Android端全套jar

    这个app可能包括了服务端和客户端两部分,服务端使用mina监听特定端口,接收客户端连接,并处理发送过来的数据;客户端则负责发起连接,发送请求,并接收服务端响应。 4. **Android集成Mina** 集成mina到Android...

    socket 与 mina 交互数据

    同时,客户端也可以使用Mina创建一个Socket连接,发送数据到服务器,并通过接收过滤器解析服务器返回的信息。 总结起来,Socket和Mina都是Java网络编程的重要工具,Socket更适合简单的、低级别的网络通信,而Mina则...

    mina2技术知识

    通过 IoSession,开发者可以发送和接收数据,管理会话状态,并且进行读写操作。 2. **FilterChain**:MINA 使用过滤器链模式来处理网络事件。过滤器链允许在数据传输前或后添加预处理或后处理逻辑,每个过滤器执行...

    mina传输对象的示例

    - 测试代码:用于验证传输和接收数据的正确性。 总的来说,Apache Mina提供了强大的工具,帮助开发者构建高性能、可扩展的网络服务,同时允许他们专注于业务逻辑,而不是底层的网络通信细节。通过理解和实践“mina...

    mina2推送demo客户端

    在"echo_client_udp"中,当客户端发送数据后,MINA2会异步等待服务器的响应,这样可以有效地避免线程阻塞,提高系统性能。 5. 学习与实践价值: "echo_client_udp"是学习MINA2和UDP通信的理想起点。通过这个示例,...

    springboot mina 串口对接

    2. 设置串口参数:如数据位、停止位、校验位等。 3. 实现串口监听器:处理数据接收事件,处理粘包和断包问题。 4. 数据发送:发送串口命令或数据,注意异步特性,可能无返回结果。 5. 错误处理:捕获并处理串口通信...

    mina自定义编解码器详解

    - 编解码器还需要处理不完整数据的情况,可能需要在解码过程中保存状态,以便在接收完整数据后继续解析。 5. **最佳实践** - 为了提高效率,编解码器应尽量减少不必要的内存复制,如使用DirectByteBuffer。 - ...

    服务端基于MINA2的UDP双向通信Demo演示(MINA2服务端)

    4. **MINA2的UDP服务端**:MINA2服务端会创建一个Acceptor监听特定的UDP端口,接收到数据后通过FilterChain进行处理,然后可能发送回相应的数据。 5. **过滤器(Filter)**:MINA2中的过滤器是处理输入和输出数据的...

    apache-mina-2.0.4.rar_apache mina_mina

    3. **IoHandler**:IoHandler是处理网络事件的主要接口,如连接建立、数据接收、连接关闭等。你可以实现这个接口来定义你的业务逻辑。 4. **ProtocolCodec**:为了处理不同协议的数据编码和解码,Mina提供了...

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

    IoSession是连接状态的容器,包含了会话中的所有信息,如远程地址、本地地址、缓冲区大小、已发送和接收的数据量等。 接下来,我们讨论"Mina心跳连接"。心跳机制是保持连接活性的重要手段,特别是在长连接中,防止...

    mina客户端简单代码示例

    2. **创建IoSession**:IoSession是Mina的核心概念,代表了客户端和服务器之间的会话。客户端需要初始化一个IoConnector来建立连接,并通过connect()方法创建IoSession。 3. **定义ProtocolCodecFilter**:为了进行...

    mina2+spring结合实例

    Mina2的核心概念包括Session、Filter和ProtocolHandler,这些组件共同协作,实现网络通信的全过程。 二、Spring框架概述 Spring是一个全方位的Java企业级应用开发框架,它涵盖了AOP(面向切面编程)、DI(依赖注入...

    mina demo全套

    通过mina demo中的TCP示例,你可以学习如何创建服务器监听客户端连接、接收和发送数据,以及处理异常和关闭连接等操作。 UDP(User Datagram Protocol)则是一种无连接的、不可靠的传输协议,它的特点是速度快,但...

Global site tag (gtag.js) - Google Analytics