与 Netty 客户端重复使用相同的本地端口号

Re-use same local port number with Netty client

我用 Netty 开发了一个 java TCP 客户端。 如果我断开连接但我不能使用相同的本地端口,我应该使用相同的本地端口号连接到服务器。我认为原因是套接字在关闭连接后处于 TIME_WAIT 状态并且内核不允许它。

是否可以始终使用相同的本地端口号连接到 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;
}