接收不全是因为readBufSize不够,会分批接收。。
作为业务来说不好分析。
1.将一次session所有 接收的wrap起来。。
2.hack session的API,Iosession实现类org.apache.mina.transport.socket.nio.SocketSessionImpl 其实是有私有方法
我们可以反射hack一下。
如此而已。。
作为业务来说不好分析。
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) {
}
}
如此而已。。