java.net.BindException: Cannot assign requested address 你所不知道的另一个原因

刚刚通过qq帮同事处理了一个客户线程问题,都这么晚了,还在现场部署应用,真实够拼的,客户不能连接外网,不能下载文件,只能通过手机拍照错误日志排查问题;

问题现象就是tomcat起不来,上来给我发了好几张错误日志照片,类似下面这样:



凭经验,一看就是某些原因导致tomcat启动失败,执行关闭操作报的一堆警告,所以让他去找tomcat启动后第一处异常,拍照如下:





这个异常报错是

org.apache.catalina.core.StandardServer.await StandardServer.await: create[localhost:18005]

    java.net.BindException: Cannot assign requested address

一看怀疑是18005 端口被占用了无法绑定;这个好说,执行命令netstat -antp|grep 18005 看哪个进程占用了18005端口直接干掉它,启动就完事了,但是谭明飞告诉我,技术支持说没有占用18005端口的进程;

于是百度谷歌了一通,总结起来有两种可能 :


1. 短时间内大量的socket连接建立并结束,导致很多TIME_WAIT端口没来及释放,端口被占用光了。解决方案,要么重用socket连接,要么开启sockets的快速回收:sysctl -w net.ipv4.tcp_tw_recycle=1;

2.本机host配置有误, 出现这个问题的用户,都是将localhost映射成了一个不存在的ip地址,更改成127.0.0.1后就ok了;


情况1不可能,技术支持正在部署应用,还没有启动成功,怎么会有大量socket连接,为了以防万一,专门使用下面的命令:

netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'

统计了一下tcpip的状态,发现全都是ESTABLISHED状态,连接才有76个,如下图:




又检查/etc/hosts配置文件,发现配置正确;


根据打印日志的第一行

org.apache.catalina.core.StandardServer.await StandardServer.await: create[localhost:18005]

服务器是在访问localhost:18005 , 判断可能和第二条有些关联,但是未必是hosts配置错误导致的问题,于是让技术支持ping一下localhost看看ip地址是不是127.0.0.1,结果发现ping命令卡住,无法ping通:


第一反应就是客户禁止ping了,于是执行以下命令,解除禁止:

 echo 0 >/proc/sys/net/ipv4/icmp_echo_ignore_all

执行后发现仍然ping不通;同时技术支持发现不但localhost地址ping不通,本机地址也一样ping不通:


但是从别的服务器上ping这台机器,和从这台机器ping别的机器是能通的;

后来让技术支持执行下ifconfig命令看下本机的ip地址:


发现竟然没有lo 回路地址,难道问题在这?马上百度了一下lo回路地址,发现它有一个配置文件:

/etc/sysconfig/network-scripts/ifcfg-lo



提示文件不存在,于是按照正常机器样本重建这个文件后,问题解决;

  • 6
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
### 回答1: java.net.bindexception: cannot assign requested address: bind一个网络编程异常,通常是由于在绑定socket时指定的IP地址不正确或已被占用所引起的。这个异常通常发生在服务器端程序中,当服务器尝试绑定一个已经被占用的端口或者一个不存在的IP地址时,就会抛出这个异常。解决这个问题的方法是检查IP地址和端口号是否正确,并确保它们没有被其他程序占用。 ### 回答2: java.net.bindexception: cannot assign requested address: bind 错误是当一个 Java 应用程序尝试绑定到一个 IP 地址和端口时,发生的异常错误。通常情况下,这个错误在以下2个主要原因下发生: 1. 系统中已经有一个程序在占用该 IP 地址和端口。 2. Java 应用程序正在尝试绑定到无效或不可用的 IP 地址和端口。 对于第一种情况,可以通过使用 netstat 命令来查找哪个程序正在占用该 IP 地址和端口,并停止该程序。例如,在 Windows 系统中,可以使用以下命令: netstat -ano | findstr :端口号 这将显示占用指定端口的进程 ID。从进程管理器中找到该进程并结束它。 对于第二种情况,可能是由于误配置或连接不可到达导致。确保 IP 地址和端口号是有效的,并且可以被应用程序访问。大多数情况下,可以通过更改应用程序配置文件中的 IP 地址和端口号来解析此问题。 另外,也可能是防火墙或代理服务器的设置阻止了对指定 IP 地址和端口的访问,需要检查这些设置并相应进行修改。 总之,java.net.bindexception: cannot assign requested address: bind 错误是由于绑定 IP 地址和端口时出现问题引起的。解决此问题需要确定哪个程序占用了该端口,以及检查应用程序配置文件中的 IP 地址和端口号是否有效。 ### 回答3: java.net.BindException: Cannot assign requested address: bind,通常出现在 Java 程序中,它指的是在服务器程序启动的时候,发现无法绑定请求的套接字地址。通俗易懂的来说,就是你设置的 IP 地址不存在或被占用。 这种情况的原因有很多,其中一个原因就是网络端口已经被占用。如果你运行的程序尝试在一个被占用的端口上进行绑定,那么它就会遇到这个问题。 要解决 java.net.BindException,可以尝试以下方法: 1.检查 IP 地址和端口是否正确或已被占用。 2.尝试更改 IP 地址和端口。 3.检查主机名是否正确。主机名必须是一个有效的 IP 地址或域名,它应该指向您要绑定的服务器的地址。 4.检查网络连接是否正常。网络连接异常可能会导致 BindException 错误。 5.如果您使用的是第三方库或框架,请确保它们和您的程序兼容并且正确配置。一些框架可以帮助您解决这种问题。 总之,要解决 java.net.BindException: Cannot assign requested address: bind 这个问题,首先要找出引起该问题的原因,然后针对性的解决问题。在解决过程中,需要耐心和细心,注意检查每个可能存在问题的地方,才能排除此类异常。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值