我的应用程序将数据发送到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()
..请hlp。
答案 0 :(得分:1)
试试这个:
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.channels.SocketChannel;
import java.nio.charset.Charset;
import java.nio.charset.CharsetEncoder;
public class JavaNetClient {
public static void main(String[] args) throws IOException {
Charset charset = Charset.forName("UTF-8");
CharsetEncoder encoder = charset.newEncoder();
SocketChannel socketChannel = SocketChannel.open(new InetSocketAddress(
"localhost", 1071));
socketChannel.configureBlocking(false);
CharBuffer charBuffer = CharBuffer.wrap("Hi\r\n");
ByteBuffer buf = encoder.encode(charBuffer);
socketChannel.write(buf);
socketChannel.close();
}
}
答案 1 :(得分:1)
您正在使用TextLineCodecFactory作为协议编解码器,它希望您的邮件以行分隔符结束。这是unix上的“\ n”,Windows上的“\ r \ n”,可以在Java上通过System.lineSeparator()
获取。
TextLineCodecFactory可用性当然取决于您的消息内容。如果您的消息在其内容中包含行分隔符,则不能使用TextLineCodecFactory。在这种情况下,您可能希望实现自己的编解码器工厂,该工厂使用特殊字符作为分隔符,固定大小的消息或type-length-value结构。