本地能否不通过/etc/hosts配置别名实现两个本地IP共用同一端口?
问题原因
你碰到的Address already in use报错是因为默认Netty服务端没有开启SO_REUSEADDR socket选项,该选项允许同一端口在绑定不同IP的场景下复用。
解决方案
1. 确认本地回环地址已配置
127.0.0.0/8整个网段都属于本地回环地址,部分系统默认仅启用127.0.0.1,你可以用以下命令临时新增127.0.0.2,无需修改/etc/hosts:
# Linux 临时生效(重启后失效) sudo ifconfig lo:0 127.0.0.2 netmask 255.0.0.0 up # Windows 以管理员身份运行cmd netsh interface ipv4 add address "Loopback Pseudo-Interface 1" 127.0.0.2 255.0.0.0
2. 给Netty服务添加端口复用配置
给两个Netty服务实例都开启SO_REUSEADDR选项即可,修改后代码如下:
import io.netty.channel.ChannelOption; final SocketAddress socketAddress = new InetSocketAddress("127.0.0.2", 8888); Server server = NettyServerBuilder.forAddress(socketAddress) .addService(coordinator) // 开启端口地址复用 .withOption(ChannelOption.SO_REUSEADDR, true) .build(); server.start(); final SocketAddress socketAddress2 = new InetSocketAddress("127.0.0.1", 8888); Server server2 = NettyServerBuilder.forAddress(socketAddress2) .addService(coordinator) .withOption(ChannelOption.SO_REUSEADDR, true) .build(); server2.start();
补充说明
如果是在Windows系统下运行,还需要注意系统默认对端口复用的限制更严格,确保两个服务绑定的IP地址完全不同,不存在0.0.0.0全地址绑定的情况即可正常生效。
内容的提问来源于stack exchange,提问作者paul
相关产品推荐
相关产品推荐

