JSTUN 出现 java.net.BindException: Address already in use: Cannot bind

本文详细分析了在使用JSTUN进行NAT穿越时遇到的java.net.BindException:Addressalreadyinuse:Cannotbind异常的原因,并通过线程延迟解决该问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用JSTUN,进行NAT穿越的时候,总是出现java.net.BindException: Address already in use: Cannot bind

换其他机器测试,没有问题。只有自己机器运行出现这个问题。

打开JSTUN源码,查看DiscoveryTest 的 Test2() 方法 170行;

int localPort = sendSocket.getLocalPort();

InetAddress localAddress = sendSocket.getLocalAddress();
sendSocket.close();

DatagramSocket receiveSocket = new DatagramSocket(localPort, localAddress);
receiveSocket.connect(ca.getAddress().getInetAddress(), ca.getPort());
receiveSocket.setSoTimeout(timeout);

是在Socket获取本地端口,然后再构造 DatagramSocket(localPort, localAddress);

经过调试,原因是因为线程, 没有执行到sendSocket.close(); 方法,就去执行new DataGramSocket(localPort , localAddress);

端口未关闭,就去构造新的Socket,就出现的以上异常信息。


在close(); 之后,执行:

try {
Thread.sleep(5);
//CPU 睡眠10毫秒,否则会出现端口还未关闭,就开始执行下面的new 语句,出现端口被占用异常(可能出四核八线程机器才有的问题)
} catch (InterruptedException e) {
e.printStackTrace();
}

### 解决 Goland 中 Java 程序运行时遇到的 `java.net.BindException: Address already in use` 问题 当在 Goland 运行 Java 应用程序并遇到 `java.net.BindException: Address already in use` 错误时,这通常意味着应用程序尝试绑定到已经被其他进程使用的网络端口[^1]。 #### 查找占用端口的进程 为了释放被占用的端口,首先需要识别哪个进程正在使用目标端口。可以通过命令提示符执行如下命令来查找: ```cmd netstat -ano | findstr ":<port>" ``` 其中 `<port>` 是要查询的具体端口号。此命令会返回一系列信息,其中包括监听该端口的服务对应的 PID(进程 ID)。通过这个 PID 可以进一步定位具体的应用程序实例[^3]。 #### 结束占用端口的进程 一旦获得了占用特定端口的进程 PID 后,在 Windows 的任务管理器中找到对应 PID 的条目,并选择结束该进程的操作。这样就可以腾出之前被占有的端口资源供新的 Java 应用连接使用了。 #### 修改应用配置文件中的端口号设置 如果频繁遭遇此类冲突情况,则建议考虑调整项目本身的配置参数,比如更改默认启动服务所依赖的 TCP/UDP 端口数值,从而避开已知容易发生碰撞的范围。对于 Spring Boot 类型的应用来说,可以在 application.properties 或者 application.yml 文件里指定 server.port 属性值为未被占用的一个有效整数[^2]。 ```properties server.port=8090 ``` 或者如果是 XML 配置形式的话则可能是这样的写法: ```xml <property name="serverPort" value="8090"/> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值