Java Netty连接超时

时间:2015-09-23 09:32:33

标签: java sockets tcp netty

我使用Netty在Ubuntu服务器上实现TCP服务器,我面临连接超时的奇怪问题。

在此服务器中,客户端应保持连接很长时间而不发送任何似乎没问题的数据:

2015-09-23 02:15:14 INFO  ChannelInboundHandlerAdapter:42 - data
2015-09-23 02:45:14 INFO  ChannelInboundHandlerAdapter:42 - data

此处的客户端能够在30分钟不活动后发送两条消息,没有任何问题。但在这种情况下:

2015-09-23 03:15:14 INFO  ChannelInboundHandlerAdapter:42 - data
2015-09-23 03:26:47 INFO  ChannelInboundHandlerAdapter:155 - Connection timed out

即使客户端只停留了10分钟而没有发送任何消息,服务器也会连接超时的连接。

这是Netty的配置:

public static void main(String args[]) {

        EventLoopGroup bossGroup = new NioEventLoopGroup();
        EventLoopGroup workerGroup = new NioEventLoopGroup();

        try {
            ServerBootstrap b = new ServerBootstrap();

            b.group(bossGroup, workerGroup)
                    .channel(NioServerSocketChannel.class)
                    .childHandler(new ChannelInitializer<SocketChannel>() {
                        @Override
                        public void initChannel(SocketChannel ch)
                                throws Exception {
                            ch.pipeline().addLast(
                                    "frameDecoder",
                                    new DelimiterBasedFrameDecoder(
                                            Integer.MAX_VALUE, Delimiters
                                                    .lineDelimiter()));
                            ch.pipeline().addLast(new GpsMessageHandler());
                        }
                    })

                    .option(ChannelOption.SO_BACKLOG, 128)
                    .childOption(ChannelOption.SO_KEEPALIVE, true);

            ChannelFuture f = b.bind(port).await();

            f.channel().closeFuture().syncUninterruptibly();

        }

        catch (Exception e) {
        }

        finally {
            workerGroup.shutdownGracefully();
            bossGroup.shutdownGracefully();
        }

    }

我检查了iptables防火墙,一切似乎都没问题(所有端口都已打开)。

任何帮助将不胜感激..

1 个答案:

答案 0 :(得分:0)

childOption(ChannelOption.CONNECT_TIMEOUT_MILLIS, 7000)

此选项处理来自客户端的每条消息的超时。但在你的情况下,

ChannelFuture f = b.bind().sync();

也许有帮助