java network-programming udp client-server apache-mina

java - El servidor Apache MINA cierra la "sesión" activa de UDP después de los 60



network-programming client-server (1)

Investigué un poco y encontré el enlace a continuación. Es posible que deba establecer explícitamente la opción de desconexión en falso, pero también hay otra opción para restablecer la opción de tiempo de espera. Un tiempo de espera de 30000 es 30 segundos, 60000 es 60 segundos, etc. Estas soluciones son de MINA2. No estaba claro si usabas esa o una versión anterior. A partir de esto, debería poder agregar la llamada que implementa un conjunto específico de opciones cuando abre el puerto UDP.

Documentación de MINA2

Mi aplicación cliente-servidor funciona con Apache MINA en ambos lados, cliente y servidor. El envío de datos a través de UDP funciona bien, pero después de un minuto, el servidor cierra la conexión (o el modo de MINA - "sesión") y deja de responder.

La parte extraña es que la conexión está activa todo el tiempo. El cliente está enviando datos cada 1000 ms y el servidor responde con los mismos datos. Encontré un mecanismo de MINA para destruir las sesiones inactivas ExpiringMap , tiene un valor predeterminado para el tiempo de vida de la sesión public static final int DEFAULT_TIME_TO_LIVE = 60; pero no he encontrado la manera de cambiarlo o mejorarlo, actualice time-to-live para las sesiones.

Imho the time-to-live debería actualizarse automáticamente con cada paquete entrante, pero no pude encontrar nada, ¿por qué no lo está haciendo mi servidor? ¿Debo decir explícitamente que no quiero que destruya la sesión todavía o qué?

Mi código es bastante similar a los tutoriales de MINA:

SERVIDOR

IoAcceptor acceptor = new NioDatagramAcceptor(); try { acceptor.setHandler( new UDPHandler() ); acceptor.bind( new InetSocketAddress(RelayConfig.getInstance().getUdpPort()) ); acceptor.getSessionConfig().setReadBufferSize( 2048 ); acceptor.getSessionConfig().setIdleTime( IdleStatus.BOTH_IDLE, IDLE_PERIOD ); System.out.println("RELAY ["+RelayConfig.getInstance().getId()+"]: initialized!"); } catch (IOException e) { System.out.println("RELAY ["+RelayConfig.getInstance().getId()+"]: failed: "+e.getLocalizedMessage()); //e.printStackTrace(); }

CLIENTE

NioDatagramConnector connector = new NioDatagramConnector(); connector.getSessionConfig().setUseReadOperation(true); handler = new UDPHandler(); connector.setHandler(handler); connector.getSessionConfig().setReadBufferSize(2048); // try to connect to server! try { System.out.println("Connecting to " + relayIP + ":" + port); ConnectFuture future = connector.connect(new InetSocketAddress(relayIP, port)); future.addListener(new IoFutureListener<IoFuture>() { public void operationComplete(IoFuture future) { ConnectFuture connFuture = (ConnectFuture)future; if( connFuture.isConnected() ){ UDPClient.setSession(future.getSession()); Timer timer = new Timer("MyTimerTask", true); timer.scheduleAtFixedRate(new MyTimerTask(), 1000, 1000); // My message is written here every 1000ms } else { log.error("Not connected...exiting"); } } }); future.awaitUninterruptibly(); } catch (RuntimeIoException e) { System.err.println("Failed to connect."); e.printStackTrace(); System.exit(1); } catch (IllegalArgumentException e) { System.err.println("Failed to connect. Illegal Argument! Terminating program!"); e.printStackTrace(); System.exit(1); }

Para cualquier información adicional, escriba en los comentarios.

EDITAR: Desafortunadamente, ya no tengo acceso a ese servidor, pero el problema no se resolvió en ese momento. Si hay alguien más que tiene el mismo problema y lo resuelve, infórmenos.