`
wangleifire
  • 浏览: 500052 次
  • 性别: 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:开始接受数据

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

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

    mina自定义编解码 不错的资源 ----其实不怎么样,技术就是拿出来共享的,开源。大家一起前进

    交通部809协议JAVA实现的接收车辆GPS数据的服务端代码

    本项目使用JAVA + MINA + ServiceLoader实现交通部809协议服务端代码。代码中完成了主链路部分,包括对客户端登录验证及应答,注销及应答,...本项目接收数据逻辑已上线测试,能够正常收到下级平台上传的车辆定位数据。

    mina串口通讯

    使用mina框架实现串口通讯,费了一番周折终于调通,和大家分享一下!

    spring boot 整合mina 串口

    找了很长时间网上没有一个详细整合的例子,现在已整合成功 放上来让大家参照,少走弯路,稍后会放出博客说明 使用idea 打开后可以直接使用的例子,很珍贵

    springboot mina 串口对接

    springboot集成mina实现串口协议对接,包含断包、粘包处理。串口协议发送与接收是异步的,发送没有返回,只能通过监听获取。

    mina编解码示例

    这个代码,在mina框架中,实现了编码解码,包含了服务器端发送数据的代码和作为客户端接收数据的代码。

    智慧农业物联网平台-后端 智慧农业物联网平台-MINA代理端

    校验码 n+8 2 类型、数据长度、数据三部分的所有字节的CRC-16码 注 1:其中字符''为转意符,所有除头尾外的字节,如果是'*','#',''在通讯时换成"*","#","\" 注 2:凡涉及多字节数据均为低字节在前 心跳包格式 ...

    Apache Mina网络通信应用框架实例

    Apache Mina Server 是一个网络通信应用框架 基于 TCP/IP、UDP/IP协议栈的通信框架 支持串口和虚拟机内部的...本实例演示了编码、解码、支持json数据发送和接收,数据格式:{命令长度4字节,命令,数据长度4字节,数据}

    Mina框架实战(由浅入深,稳扎稳打)

    test2:在控制台中Server可以给所有Client发送数据,Client可以给Sever和其他Client发送数据。 test3:(1)特定角色的Client处理消息。 (2)特定角色的Client收到消息。 Client与Server建立Session后,Server...

    Mina2.0.0_RC1 例子

    本例子是MyEclipse的JAVA工程,使用encoder和decoder对传输的数据对象编解码,接收和返回的数据头四个字节都表示后面数据的长度,源码中包含详细注释,理解后可修改为传输任意对象。 src源码包下的test.mina.server...

    mina UDP 数据库连接池

    基于MINA架构实现的UDP接收服务器,支持对mysql数据库的连接池插入查找操作。数据接收采用MINA,处理使用线程池并结合数据库连接池实现对发送数据的储存。

    mina高性能Java网络框架.rar

    mina是一个基于java nio的网络通信框架。主要屏蔽了网络通信的一些细节,对Socket进行封装,并且是NIO的一个实现架构,...3.Mina 的API 将真正的网络通信与我们的应用程序隔离开来,你只需要关心你要发送、接收的数据

    JAVA上百实例源码以及开源项目源代码

    2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...

    JAVA上百实例源码以及开源项目

    2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...

    servlet tcp socket 异步转同步调用的两种解决办法

    场景如下图, ... 1,这里的服务端到认证是TCP 异步的。...这里需要服务端接收到认证返回的数据结果过后,才能返回给终端。 附件代码是解决该问题的两种解决方案,可以用户同步的mina之类的socket调用。

    doudizhu:斗地主游戏服务端-开发中

    手机端、桌面软件是通过socket长连进行数据交互,浏览器是通过webSocket长连进行数据交互。 #技术框架 springMVC、mybatis、webSocket、mina、jms、mongoDB、memcache #使用 SocketHandler类用来接收和返回客户端...

Global site tag (gtag.js) - Google Analytics