【问题标题】:Apache MINA server closes active UDP "session" after 60sApache MINA 服务器在 60 秒后关闭活动的 UDP“会话”
【发布时间】: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


【解决方案1】:

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

MINA2 Documentation

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    • 2015-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多