我的应用程序将数据发送到Apache Mina Server,后者使用以下配置进行侦听。 IoAcceptor acceptor = new NioSocketAcceptor(); acceptor.getFilterChain().addLast( "logger", new LoggingFilter() ); //acceptor.getFilterChain().addLast( "logger1", new TempFilter()); acceptor.getFilterChain().addLast( "codec", new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName( "UTF-8" )))); acceptor.setHandler( new TimeServerHandler() ); acceptor.getSessionConfig().setReadBufferSize( 2048 ); acceptor.getSessionConfig().setIdleTime( IdleStatus.BOTH_IDLE, 10 ); acceptor.bind( new InetSocketAddress(PORT) );
这是我用net.Socket编写的客户代码OutputStream oStrm = socket.getOutputStream();byte[] byteSendBuffer = (requests[clientNo][j]).getBytes(Charset.forName("UTF-8"));oStrm.write(byteSendBuffer);oStrm.flush();
尽管记录器显示消息已收到,
永远不会调用服务器处理程序的messageRecieved()
。
最佳答案
您正在使用TextLineCodecFactory作为协议编解码器,希望您的消息以行距结尾。在Unix上为“ \ n”,在Windows上为“ \ r \ n”,可以在Java上通过System.lineSeparator()
获得。
当然,TextLineCodecFactory的可用性取决于消息的内容。如果您的消息的内容中包含行定界符,则不能使用TextLineCodecFactory。在这种情况下,您可能想实现自己的编解码器工厂,该工厂使用特殊字符作为分隔符,固定大小的消息或type-length-value结构。