簡體   English   中英

與 Netty 客戶端重復使用相同的本地端口號

[英]Re-use same local port number with Netty client

我用 Netty 開發了一個 java TCP 客戶端。 如果我斷開連接但我不能使用相同的本地端口,我應該使用相同的本地端口號連接到服務器。 我認為原因是套接字在關閉連接后處於 TIME_WAIT state 並且 kernel 不允許它。

是否有始終使用相同的本地端口號連接到 TCP 服務器?

您可以使用.option(ChannelOption.SO_REUSEADDR, true)

示例代碼:

private Bootstrap createBootstrap(ConnectionConfig config) {
    final int THREAD_NUM = 1;
    Bootstrap bootstrap = new Bootstrap();
    EventLoopGroup group = new NioEventLoopGroup(THREAD_NUM);

    bootstrap.group(group)
            .channel(NioSocketChannel.class)
            .option(ChannelOption.TCP_NODELAY, true)
            .option(ChannelOption.SO_KEEPALIVE, true)
            .option(ChannelOption.SO_REUSEADDR, true)
            .handler(new ChannelInitializer<SocketChannel>() {

                @Override
                protected void initChannel(SocketChannel channel) throws Exception {
                    ChannelPipeline pipeline = channel.pipeline();
                    pipeline.addLast(new IdleStateHandler(config.getReaderIdleTimeMs(), config.getWriterIdleTimeMs(), 0, TimeUnit.MILLISECONDS));
                    pipeline.addLast(new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE, PacketProtocol.Offset.LENGTH, PacketProtocol.LENGTH_LEN, 0-PacketProtocol.LENGTH_LEN, 0));
                    pipeline.addLast(new CodecHandler());
                    pipeline.addLast(new NettyChannelHandler(ConnectionImpl.this));
                }
            });
    try {
        bootstrap.bind(localPort).sync();
    } catch (InterruptedException e) {
        LOG.error("bootstrap bind localPort={} error", localPort, e);
        throw new IllegalStateException("bootstrap bind error");
    }
    return bootstrap;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM