Jak*_*sky 25 java udp network-programming client-server apache-mina
我的客户端 - 服务器应用程序在客户端和服务器端都与Apache MINA一起使用.通过UDP发送数据工作正常,但在一分钟服务器关闭连接(或MINA的方式 - "会话")后停止应答.
奇怪的是,连接始终处于活动状态.客户端每1000ms发送一次数据,服务器使用相同的数据回复它.我发现了一个MINA的机制来销毁非活动会话ExpiringMap,它有一个会话的生存时间的默认值,public static final int DEFAULT_TIME_TO_LIVE = 60;但我还没有找到一种方法如何更改它或更好,更新会话的生存时间.
Imho生存时间应该自动更新每个传入的数据包,但我找不到为什么不是我的服务器做的事情.我是否应该明确表示我不希望它破坏会话或什么?
我的代码与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);
}
如有任何其他信息,请在评论中写下.
编辑:不幸的是我不再访问该服务器,但当时问题没有解决.如果有其他人有同样的问题并解决了它,请告诉我们.