Справка по соединителю Apache MINA NIO - PullRequest
2 голосов
/ 29 апреля 2010

Я новичок в использовании MINA. У меня есть программа, которая использует MINA NIOconnector для подключения к хосту. Я могу отправлять данные, а также получать. Это ясно из журнала log4j, который я прилагаю ниже.

E:\>java TC4HostClient
[12:21:46] NioProcessor-1 INFO  [] [] [org.apache.mina.filter.logging.LoggingFil
ter] - CREATED
[12:21:46] NioProcessor-1 INFO  [] [] [org.apache.mina.filter.logging.LoggingFil
ter] - OPENED
Opened
CGS Sign On
[12:21:46] NioProcessor-1 INFO  [] [] [org.apache.mina.filter.logging.LoggingFil
ter] - SENT: HeapBuffer[pos=0 lim=370 cap=512: 20 20 20 20 20 20 20 20 20 20 20
20 20 20 20 20...]
[12:21:46] NioProcessor-1 INFO  [] [] [org.apache.mina.filter.logging.LoggingFil
ter] - SENT: HeapBuffer[pos=0 lim=0 cap=0: empty]
Message Sent                00000333CST   1001010        00000308000003080010000
000009600000000FTS O00000146TC4DS       001WSJTC41   ---001NTMU9001-I        ---
-----000                       0030000000012400000096500007013082015SATYA 500000
              010165070000002200011
                 01800000000022000001241   172.16.25.122   02
[12:21:46] NioProcessor-1 INFO  [] [] [org.apache.mina.filter.logging.LoggingFil
ter] - RECEIVED: HeapBuffer[pos=0 lim=36 cap=2048: 20 20 20 20 20 20 20 20 20 20
 20 20 20 20 20 20...]
[12:21:46] NioProcessor-1 INFO  [] [] [org.apache.mina.filter.logging.LoggingFil
ter] - RECEIVED: HeapBuffer[pos=0 lim=505 cap=2048: 31 20 20 20 20 20 20 20 20 3
0 30 30 30 30 34 38...]
After Writing
[12:21:52] NioProcessor-1 INFO  [] [] [org.apache.mina.filter.logging.LoggingFil
ter] - CLOSED

Хотя я вижу "RECEIVED" в журнале, мой обработчик messageReceived не вызывается Может кто-нибудь, пожалуйста, помогите мне в этом отношении и скажите мне, что я делаю неправильно

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.charset.Charset;
import java.net.SocketAddress;

import org.apache.mina.core.service.IoAcceptor;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.filter.logging.LoggingFilter;
import org.apache.mina.transport.socket.nio.NioSocketConnector;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.core.future.*;

public class TC4HostClient
{
    private static final int PORT = 9123;

    public static void main( String[] args ) throws IOException,Exception
    {
        NioSocketConnector connector = new NioSocketConnector();
        SocketAddress address = new InetSocketAddress("172.16.25.3", 8004);
        connector.getSessionConfig().setReadBufferSize( 2048 );

        connector.getFilterChain().addLast( "logger", new LoggingFilter() );
        connector.getFilterChain().addLast( "codec", new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName( "UTF-8" ))));

        connector.setHandler(new TC4HostClientHandler());
        ConnectFuture future1 = connector.connect(address);

        future1.awaitUninterruptibly();

        if (!future1.isConnected()) {
            return ;
        }
        IoSession session = future1.getSession();


        System.out.println("CGS Sign On");
        session.getConfig().setUseReadOperation(true);
        session.write("                00000333CST   1001010        00000308000003080010000000009600000000FTS O00000146TC4DS       001WSJTC41   ---001NTMU9001-I        --------000                       0030000000012400000096500007013082015SATYA 500000              010165070000002200011                                                              01800000000022000001241   172.16.25.122   02");

        session.getCloseFuture().awaitUninterruptibly();

        System.out.println("After Writing");
        connector.dispose();





    }
}

import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.core.buffer.IoBuffer;

public class TC4HostClientHandler extends IoHandlerAdapter
{
    @Override
    public void exceptionCaught( IoSession session, Throwable cause ) throws Exception
    {
        cause.printStackTrace();
    }
    @Override
    public void messageSent( IoSession session, Object message ) throws Exception
    {
        String str = message.toString();
        System.out.println("Message Sent" + str);
    }

    @Override
    public void messageReceived( IoSession session, Object message ) throws Exception
    {
        IoBuffer buf = (IoBuffer) message;
        // Print out read buffer content.
        while (buf.hasRemaining()) {
            System.out.print((char) buf.get());
        }
        System.out.flush();

    }
    /*
    @Override
    public void messageReceived( IoSession session, Object message ) throws Exception
    {
        String str = message.toString();
        System.out.println("Message Received : " + str);
    }*/

    @Override
    public void sessionIdle( IoSession session, IdleStatus status ) throws Exception
    {
        System.out.println( "IDLE " + session.getIdleCount( status ));
    }

    public void sessionClosed(IoSession session){
        System.out.println( "Closed ");
    }
    public void sessionOpened(IoSession session){
        System.out.println( "Opened ");
    }
}

Ответы [ 3 ]

2 голосов
/ 15 июля 2010

Сегодня я впервые работал над MINA, и я обнаружил, что суровая реальность заключается в том, что помощь по MINA трудно найти. Даже собственный сайт почти без него. С помощью нескольких частей информации, которую мне удалось собрать, включая вашу, и с помощью предоставленной документации мне удалось подключиться, отправить и получить ответ от сервера. Но, к моему удивлению, метод messageReceived (..) не был вызван, просто регистрация показала, что я получил требуемый ответ. Сообщение журнала было в Unicode (шестнадцатеричное значение). Не было никаких исключений или каких-либо указаний на то, что пошло не так. Я искал это. Затем я просмотрел источник TextLineCodecFactory, и он тоже выглядел хорошо. Я просмотрел код сервера и обнаружил, что они используют собственный кодек. Так что, на мой взгляд, ваша проблема такая же, как я столкнулся. Убедитесь, что кодек с обеих сторон одинаков или по крайней мере выполняет одинаковые преобразования.

2 голосов
/ 03 мая 2010

Я не могу сказать из ваших включенных журналов, но TextLineDecoder, созданный TextLineCodecFactory, будет искать (по умолчанию) '\ r' (0x0d) или '\ n' (0x0a) для завершения строки и генерирования завершенное сообщение для обработки вашим IoHandlerAdapter. Правильно ли завершены входящие данные?

0 голосов
/ 03 февраля 2012

Это связано с фабрикой кодеков. Я перешел на пользовательский кодек, так как у нас есть пользовательские форматы сообщений в проекте. Спасибо всем за ваши ответы.

...