2.0以下mina信息接收不全解决方案

接收不全是因为readBufSize不够,会分批接收。。
作为业务来说不好分析。

1.将一次session所有 接收的wrap起来。。

 public void messageReceived(IoSession session, Object message) throws Exception {
  //根据下面的值  循环把接收的消息收集起来,然后组成整个消息,不过这种做成多线程的话会有一些问题
  接收过来的消息可能不会按顺序接收,一般不会有问题
}
     totalSize=  session.getReadBytes() 消息体的整体长度 例如 10k
     message  的len   每次接收的大小 例如 1k,2k,4k,2k



2.hack session的API,Iosession实现类org.apache.mina.transport.socket.nio.SocketSessionImpl 其实是有私有方法
我们可以反射hack一下。
    public void sessionCreated(IoSession session) throws Exception {
        super.sessionCreated(session);
        

        //一次读的缓存大小,不然消息会分批接收
        hackReadBufSize(session, 8* 1024);
    }

    /**
     * hack无权限类相关域
     */
    private void hackReadBufSize(IoSession session, int readBuf) {
        try {
            Method method = session.getClass().getDeclaredMethod("setReadBufferSize", int.class);

            method.setAccessible(true);

            method.invoke(session, readBuf);

        } catch (Exception e) {

        }
    }



如此而已。。

你可能感兴趣的:(apache,多线程,socket,Mina)