由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