mina接收数据不全(2)

xiaoxiao2026-08-29  1

由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);         }     }

相关资源:敏捷开发V1.0.pptx
转载请注明原文地址: https://www.6miu.com/read-5052054.html

最新回复(0)