Мое клиент-серверное приложение работает с Apache MINA как на стороне клиента, так и на стороне сервера. Отправка данных через UDP работает нормально, но через минуту сервер закрывает соединение (или MINA-путь - "сеанс" ) и перестает отвечать.
Странная часть заключается в том, что соединение активно все время. Клиент отправляет данные каждые 1000 мс, а сервер отвечает на них с теми же данными. Я нашел механизм MINA для уничтожения неактивных сеансов ExpiringMap, он получил значение по умолчанию для сеанса time-to-live public static final int DEFAULT_TIME_TO_LIVE = 60;
но я не нашел способ изменить его или лучше, обновить время для жизни для сеансов.
Imho, время жизни должно автоматически обновляться с каждым входящим пакетом, но я не мог найти что-то, почему не работает мой сервер. Должен ли я сказать, что я не хочу, чтобы он уничтожал сеанс или что?
Мой код очень похож на учебники MINA:
СЕРВЕР
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();
}
КЛИЕНТ
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);
}
Для получения дополнительной информации напишите в комментариях.
EDIT: К сожалению, у меня больше нет доступа к этому серверу, но тогда проблема не была решена. Если есть кто-нибудь другой, у кого есть такая же проблема и решить проблему, сообщите нам.