Сервер и клиент Apache Mina в java.net.Socket

Мое приложение отправляет данные на сервер Apache Mina, который прослушивает следующую конфигурацию.


        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() никогда не вызывается. Пожалуйста, помогите.


person shahalpk    schedule 15.11.2012    source источник


Ответы (2)


Вы используете TextLineCodecFactory в качестве кодека протокола, который ожидает, что ваши сообщения будут заканчиваться разделителем строк. Это «\n» в Unix, «\r\n» в Windows, которые можно получить с помощью System.lineSeparator() на Java.

Конечно, удобство использования TextLineCodecFactory зависит от содержания ваших сообщений. Если ваше сообщение включает в себя символ-разделитель строк, вы не можете использовать TextLineCodecFactory. В этом случае вы можете реализовать свою собственную фабрику кодеков, которая использует специальный символ в качестве разделителя, сообщения фиксированного размера или тип-длина-значение структура.

person Akdeniz    schedule 05.12.2012

Попробуй это:

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();

    }
}
person Ricardo Cristian Ramirez    schedule 05.12.2012