Meine Client-Server-App arbeitet mit Apache MINA sowohl auf Client- als auch auf Serverseite. Das Senden von Daten über UDP funktioniert einwandfrei, aber nach einer Minute schließt der Server die Verbindung (oder den Weg von MINA - "Sitzung") und hört auf zu antworten.Apache MINA Server schließt aktive UDP "Sitzung" nach 60s
Der komische Teil ist, dass die Verbindung die ganze Zeit aktiv ist. Der Client sendet alle 1000 ms Daten und der Server antwortet mit denselben Daten. Ich habe einen MINA-Mechanismus gefunden, um inaktive Sitzungen zu zerstören ExpiringMap, es hat einen Standardwert für Session-Time-to-live public static final int DEFAULT_TIME_TO_LIVE = 60;
, aber ich habe keinen Weg gefunden, wie Sie es ändern oder besser, Time-to-Live für Sitzungen aktualisieren.
Imho die Time-to-Live sollte automatisch mit jedem eingehenden Paket aktualisiert werden, aber ich konnte nichts finden, warum es nicht mein Server tut. Soll ich explizit sagen, dass ich die Sitzung noch nicht zerstören will oder was?
Mein Code ist ganz ähnlich wie MINA des Tutorials:
SERVER
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();
}
CLIENT
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);
}
Für weitere Informationen schreiben Sie bitte in den Kommentaren.
EDIT: Leider habe ich keinen Zugriff auf diesen Server mehr, aber das Problem wurde damals nicht gelöst. Wenn es noch jemanden gibt, der das gleiche Problem hat und es gelöst hat, lassen Sie es uns wissen.
Was ist der Wert von IDLE_PERIOD? Vielleicht schließen Sie die Verbindung, wenn der Ruhezustand empfangen wird? Könnten Sie Ihren IOHandler Code eingeben? –
Welche Mina-Version verwendest du? – igreen
@Ricardo Cristian Ramirez IDLE_PERIOD ist auf 10 gesetzt, es gibt keine explizite Verbindung zum Schließen und es funktioniert gut mit iOS-Geräten, nur nicht mit Java-Desktop-Client (MINA oder DatagramSocket-Implementierung) und Android-Client. –