我的客户端-服务器应用程序在客户端和服务器端都可与 Apache MINA 配合使用。通过 UDP 发送数据工作正常,但一分钟后服务器关闭连接(或 MINA 的方式 - “会话”)并停止应答。
奇怪的是,连接始终处于活动状态。客户端每 1000 毫秒发送一次数据,服务器用相同的数据回复它。我发现了 MINA 的机制来销毁不活动的会话ExpiringMap,它有一个会话生存时间的默认值
public static final int DEFAULT_TIME_TO_LIVE = 60;
,但我还没有找到一种方法来改变它或更好,更新时间-直播会议。
恕我直言,生存时间应该随着每个传入数据包自动更新,但我找不到为什么我的服务器不这样做的原因。我应该明确地说我不希望它破坏会话还是什么?
我的代码与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);
}
如需任何其他信息,请在评论中写下。
编辑:不幸的是我无法再访问该服务器,但当时问题还没有解决。如果还有其他人遇到同样的问题并解决了它,请告诉我们。
我做了一些研究并找到了下面的链接。您可能需要显式地将断开连接选项设置为 false,但还有另一个选项可以重置超时选项。超时 30000 是 30 秒,60000 是 60 秒,等等......这些解决方案来自 MINA2。目前尚不清楚您使用的是该版本还是旧版本。由此,您应该能够添加在打开 UDP 端口时实现一组特定选项的调用。
解决方案是创建一个 ExpiringSessionRecycler,如下所示:
NioDatagramAcceptor 接受器 = new NioDatagramAcceptor();
ExpiringSessionRecycler sessionRecycler = new ExpiringSessionRecycler(600); //600=10分钟
Acceptor.setSessionRecycler(sessionRecycler);