Java Apache MINA服务器关闭活动UDP“;会议“;60岁以后

Java Apache MINA服务器关闭活动UDP“;会议“;60岁以后,java,network-programming,udp,client-server,apache-mina,Java,Network Programming,Udp,Client Server,Apache Mina,我的客户端-服务器应用程序在客户端和服务器端都与Apache MINA配合使用。通过UDP发送数据工作正常,但一分钟后服务器关闭连接(或MINA的方式——“会话”)并停止应答 奇怪的是,这种连接一直处于活动状态。客户端每1000毫秒发送一次数据,服务器用相同的数据应答。我发现了MINA销毁非活动会话的机制,它有一个会话生存时间的默认值public static final int default_time_to_live=60但我还没有找到一种方法来改变它,或者更新会话的生存时间 我想我的生存时

我的客户端-服务器应用程序在客户端和服务器端都与Apache MINA配合使用。通过UDP发送数据工作正常,但一分钟后服务器关闭连接(或MINA的方式——“会话”)并停止应答

奇怪的是,这种连接一直处于活动状态。客户端每1000毫秒发送一次数据,服务器用相同的数据应答。我发现了MINA销毁非活动会话的机制,它有一个会话生存时间的默认值
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);
}
NioDatagramConnector连接器=新的NioDatagramConnector();
connector.getSessionConfig().setUseReadOperation(true);
handler=新的UDPHandler();
connector.setHandler(handler);
connector.getSessionConfig().setReadBufferSize(2048);
//尝试连接到服务器!
试一试{
System.out.println(“连接到“+relayIP+”:“+port”);
ConnectFuture=connector.connect(新的InetSocketAddress(relayIP,port));
future.addListener(新的IoFutureListener(){
公共无效操作完成(IoFuture){
ConnectFuture connfourt=(ConnectFuture)future;
if(connfourture.isConnected()){
UDPClient.setSession(future.getSession());
计时器=新计时器(“MyTimerTask”,true);
timer.scheduleAtFixedRate(new MyTimerTask(),10001000);//我的消息每1000ms写一次
}否则{
日志错误(“未连接…正在退出”);
}
}
});
未来。不间断地等待();
}捕获(RuntimeIOE异常){
System.err.println(“连接失败”);
e、 printStackTrace();
系统出口(1);
}捕获(IllegalArgumentException e){
System.err.println(“连接失败。参数非法!正在终止程序!”);
e、 printStackTrace();
系统出口(1);
}
如需更多信息,请在评论中填写


编辑:不幸的是,我再也不能访问该服务器了,但那个时候问题并没有得到解决。如果还有其他人有同样的问题并解决了,请告诉我们。

我做了一些研究,找到了下面的链接。您可能需要显式地将disconnect选项设置为false,但还有另一个选项可以重置timeout选项。超时30000是30秒,60000是60秒,等等。。。这些解决方案来自MINA2。不清楚您使用的是该版本还是旧版本。由此,您应该能够添加在打开UDP端口时实现特定选项集的调用


空闲时间的值是多少?也许,您在收到空闲状态时关闭了连接?你能把你的IOHandler代码放进去吗?你用的是哪一个mina版本?@Ricardo Cristian Ramirez IDLE_PERIOD设置为10,没有显式的连接关闭,它在iOS设备上运行良好,只是不适用于java桌面客户端(mina或DatagramSocket实现)和android客户端。@user467257每秒通过UDPClient.getSession().write()发送数据。如您所见,此会话设置在计时器初始化之上。写操作每秒执行一次,消息到达服务器正常,因此会话处于活动状态,并在该分钟内每秒使用一次。TIME_to_LIVE是IP数据包的一部分,与连接无关。事实上,UDP是无连接的。UDP连接的整个概念在Mina中实现。米娜身上有东西要结束这次会议。