【发布时间】:2015-01-28 08:08:06
【问题描述】:
我的客户端-服务器应用程序在客户端和服务器端都与 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);
}
如需其他信息,请在 cmets 中填写。
编辑:不幸的是,我无法再访问该服务器,但当时问题并未解决。如果有其他人遇到同样的问题并解决了,请告诉我们。
【问题讨论】:
-
IDLE_PERIOD 的值是多少?也许,您在收到空闲状态时关闭连接?你能把你的IOHandler代码吗?
-
你用的是哪个版本的?
-
@Ricardo Cristian Ramirez IDLE_PERIOD 设置为 10,没有显式连接关闭,它适用于 iOS 设备,但不适用于 java 桌面客户端(MINA 或 DatagramSocket 实现)和 android 客户端。跨度>
-
@user467257 它每秒通过 UDPClient.getSession().write() 发送数据。如您所见,此会话设置在 Timer 初始化之上。每秒执行一次写入,并且消息正常到达服务器,因此会话处于活动状态并在那一分钟的每一秒使用。
-
TIME_TO_LIVE 是 IP 数据包的一部分,与连接无关。事实上,UDP 是无连接的。 UDP 连接的整个概念在 Mina 中实现。 Mina 中有东西正在关闭 IoSession。
标签: java network-programming udp client-server apache-mina