繁体   English   中英

Java Netty连接超时

[英]Java Netty connection timed out

我正在使用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防火墙,一切似乎都正常(所有端口均打开)。

任何帮助将不胜感激..

childOption(ChannelOption.CONNECT_TIMEOUT_MILLIS, 7000)

此选项处理来自客户端的每条消息的超时。 但就您而言,

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

也许有帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM