Использование Mina DatagramConnector не работает - PullRequest
0 голосов
/ 13 июля 2020

У меня есть клиент tcp, основанный на фреймворке mina (V2.0.21 и J8). Он работает нормально.

Вот минимальный пример:

    private static IoConnector connector;
    
    public static void main(String[] args) throws InterruptedException {
    
        connector = new NioSocketConnector();
        
        connector.getFilterChain().addLast( "logger", new LoggingFilter() );
        connector.getFilterChain().addLast( "codec", new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName( "UTF-8" ))));
    
        connector.setHandler(new Handler());
    
        try {
            ConnectFuture connFuture = connector.connect(new InetSocketAddress("x.x.x.x", 9999));
            connFuture.awaitUninterruptibly();
            connFuture.getSession();
        } catch (Exception e) {
            System.err.println(e);
        }
        
        while(true) {
            System.out.println("sleep.");
            Thread.sleep(3000);
        }
    }

Это мой обработчик:

    public class Handler implements IoHandler {
        @Override
        public void messageReceived(IoSession session, Object message) throws Exception {
            String str = (String)message;
            System.out.println("->" + str);
        }
    
        @Override
        public void sessionCreated(IoSession session) throws Exception {
            System.out.println("CREATED.");
            
        }
    
        @Override
        public void sessionOpened(IoSession session) throws Exception {
            System.out.println("OPENED.");
            
        }
        ...
    }

Теперь я изменил строку

От
        connector = new NioSocketConnector();

до

        connector = new NioDatagramConnector();

, чтобы иметь возможность получать данные через UDP.

Если теперь я отправляю пакеты через UDP (например, с помощью инструмента тестирования сети) на порт 9999 эта программа больше ничего не получит. Но я вижу информацию журнала, что сеанс был открыт и создан. Может кто-нибудь объяснить, почему UDP не работает (точнее, c: messageReceived () не вызывается), а TCP работает?

ОБНОВЛЕНИЕ: В качестве инструмента тестирования я использую этот метод здесь:

        public static void main(String[] args) throws IOException {
            InetAddress ia = InetAddress.getByName("x.x.x.x");
            int port = 9999;
            String s = "Message";
            byte[] data = s.getBytes();
            DatagramPacket packet = new DatagramPacket( data, data.length, ia, port );
            DatagramSocket toSocket = new DatagramSocket();
            toSocket.send( packet );
            toSocket.close();
            System.out.println("Send.");
        }

Спасибо

1 Ответ

0 голосов
/ 15 июля 2020

Хорошо, секрет заключается в том, чтобы знать, что в случае UDP и «соединительная», и «принимающая» сторона обрабатываются классом NioDatagramAcceptor.

Этот фрагмент кода выполняет c сторона UDP- «коннектора»:

    NioDatagramAcceptor acceptor = new NioDatagramAcceptor();
    acceptor.getFilterChain().addLast( "logger", new LoggingFilter() );
    acceptor.getFilterChain().addLast( "codec", new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName( "UTF-8" ))));
    acceptor.setHandler(new Handler());
    acceptor.bind(new InetSocketAddress(9999));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...