必须在bind前设置so_reuseaddr,否则无效;其作用是允许新套接字重用处于time_wait状态的本地地址,避免重启时“address already in use”错误。

可以在创建 ServerSocketChannel 后、绑定(bind)前,通过 setOption 方法设置 SO_REUSEADDR 为 true。
必须在 bind 之前设置
该选项仅在通道未绑定时生效。一旦调用 bind(),再尝试修改会抛出 IllegalStateException 或被忽略。
- 正确顺序:open → setOption → bind → accept
- 错误顺序:open → bind → setOption(无效)
标准写法示例
使用 StandardSocketOptions.SO_REUSEADDR 常量,确保类型安全:
ServerSocketChannel ssc = ServerSocketChannel.open();
ssc.configureBlocking(false);
ssc.setOption(StandardSocketOptions.SO_REUSEADDR, true); // 关键一步
ssc.bind(new InetSocketAddress("localhost", 8080));
为什么需要 SO_REUSEADDR
启用后可避免“Address already in use”异常,尤其在服务快速重启时:
- TCP 连接关闭后进入 TIME_WAIT 状态(通常持续 2~4 分钟)
- 若端口仍被占用,未设此选项则
bind失败 - 设为
true允许新 socket 重用处于 TIME_WAIT 的本地地址
注意平台差异
行为基本一致,但部分旧版 Windows 可能表现略有不同;现代 Linux/macOS 和 JDK 8+ 均稳定支持。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











