【问题标题】:How to solve java.net.BindException: Address already in use如何解决 java.net.BindException:地址已在使用中
【发布时间】:2016-12-05 13:59:21
【问题描述】:

我正在尝试使用本教程 https://www.digitalocean.com/community/tutorials/how-to-install-apache-tomcat-8-on-ubuntu-14-04 在 ubuntu 14 上通过数字海洋设置一个 tomcat 8 服务器。但我无法访问 tomcat 启动页面。

一切都很顺利,直到我开始使用

sudo initctl 启动 tomcat

这会返回一条消息

tomcat 启动/运行,进程 9180

但是当我输入网址时

my-droplet-ip-address:8080

启动页面永远不会加载。

我读到你可以用

启动tomcat

sh 启动.sh

虽然当我这样做时 catalina.out 给了我错误信息

31-Jul-2016 05:37:41.018 INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["http-nio-8080"]
31-Jul-2016 05:37:41.086 SEVERE [main] org.apache.coyote.AbstractProtocol.init Failed to initialize end point associated with ProtocolHandler ["http-nio-8080"]
 java.net.BindException: Address already in use
    at sun.nio.ch.Net.bind0(Native Method)
    at sun.nio.ch.Net.bind(Net.java:433)
    at sun.nio.ch.Net.bind(Net.java:425)
    at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223)
    at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74)
    at org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:229)
    at org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:866)
    at org.apache.tomcat.util.net.AbstractJsseEndpoint.init(AbstractJsseEndpoint.java:213)
    at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:558)
    at org.apache.coyote.http11.AbstractHttp11Protocol.init(AbstractHttp11Protocol.java:65)
    at org.apache.catalina.connector.Connector.initInternal(Connector.java:1010)
    at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:107)
    at org.apache.catalina.core.StandardService.initInternal(StandardService.java:549)
    at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:107)
    at org.apache.catalina.core.StandardServer.initInternal(StandardServer.java:873)
    at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:107)
    at org.apache.catalina.startup.Catalina.load(Catalina.java:606)
    at org.apache.catalina.startup.Catalina.load(Catalina.java:629)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:311)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:494)

31-Jul-2016 05:37:41.089 SEVERE [main] org.apache.catalina.core.StandardService.initInternal Failed to initialize connector [Connector[HTTP/1.1-8080]]
 org.apache.catalina.LifecycleException: Failed to initialize component [Connector[HTTP/1.1-8080]]
    at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:111)
    at org.apache.catalina.core.StandardService.initInternal(StandardService.java:549)
    at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:107)
    at org.apache.catalina.core.StandardServer.initInternal(StandardServer.java:873)
    at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:107)
    at org.apache.catalina.startup.Catalina.load(Catalina.java:606)
    at org.apache.catalina.startup.Catalina.load(Catalina.java:629)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:311)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:494)
Caused by: org.apache.catalina.LifecycleException: Protocol handler initialization failed
    at org.apache.catalina.connector.Connector.initInternal(Connector.java:1012)
    at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:107)
    ... 12 more
Caused by: java.net.BindException: Address already in use
    at sun.nio.ch.Net.bind0(Native Method)
    at sun.nio.ch.Net.bind(Net.java:433)
    at sun.nio.ch.Net.bind(Net.java:425)
    at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223)
    at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74)
    at org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:229)
    at org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:866)
    at org.apache.tomcat.util.net.AbstractJsseEndpoint.init(AbstractJsseEndpoint.java:213)
    at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:558)
    at org.apache.coyote.http11.AbstractHttp11Protocol.init(AbstractHttp11Protocol.java:65)
    at org.apache.catalina.connector.Connector.initInternal(Connector.java:1010)
    ... 13 more

31-Jul-2016 05:37:41.091 INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["ajp-nio-8181"]
31-Jul-2016 05:37:41.105 INFO [main] org.apache.tomcat.util.net.NioSelectorPool.getSharedSelector Using a shared selector for servlet write/read
31-Jul-2016 05:37:41.117 INFO [main] org.apache.catalina.startup.Catalina.load Initialization processed in 1568 ms
31-Jul-2016 05:37:41.180 INFO [main] org.apache.catalina.core.StandardService.startInternal Starting service Catalina
31-Jul-2016 05:37:41.180 INFO [main] org.apache.catalina.core.StandardEngine.startInternal Starting Servlet Engine: Apache Tomcat/8.5.4
31-Jul-2016 05:37:41.211 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory /opt/tomcat/webapps/host-manager

我已经检查了 sudo lsof -i 正在使用哪些端口,并尝试终止使用 tomcat 所需端口的进程,以及更改 server.xml 中的各种端口以避免此错误。但无论我做什么,它都会不断发生。

我最近也看到了这个链接

https://www.digitalocean.com/community/questions/tomcat-not-starting-in-ubuntu-14-04-tomcat-7-and-java-7

这表明

这可能是由于熵源问题。设置选项

-Djava.security.egd=file:/dev/./urandom 在 catalina.sh 或 /etc/default/tomcat 中。

问题是我找不到文件/etc/default/tomcat,也无法弄清楚在catalina.sh中的哪个位置添加作者建议的这一行。

为什么我无法启动 tomcat 进入启动页面?这真的是与入口源有关的问题吗?如果是这样,这条线在 catalina.sh 的哪里?如果没有,任何有关我如何解决此问题的建议将不胜感激。

【问题讨论】:

  • 我认为问题在于,当您尝试使用 sh startup.sh 启动 tomcat 时,您不能因为作为服务启动的实例已经在使用端口。您可以使用netstat 命令查看哪些端口正在使用以及哪些进程正在使用。
  • address in use 表示另一个应用程序正在使用您尝试启动 tomcat 的端口地址,就像@Titus 所说的那样,或者它是另一个应用程序

标签: java linux ubuntu-14.04 digital-ocean tomcat8


【解决方案1】:

您已经知道这个问题的根本原因是您的应用程序试图连接到某个特定端口,而该端口已被其他一些 Java 或非 Java 进程使用。 这是你的答案:

在你的 server.xml 中找到这四个端口

  1. HTTP/1.1
  2. Tomcat 管理端口。
  3. AJP/1.3
  4. SSL(如果启用)。

使用 netstat 命令查找正在使用这些端口的进程。

netstat -nap | grep <port>

既然你发现了一个有问题的进程,你可以杀掉那个进程,如果杀掉那个进程没问题,你可以重新启动你的进程,否则,在你的 server.xml 中更改端口

对所有 4 个端口执行此操作,然后重新启动 tomcat。检查 catalina.out,如果一切顺利,您将能够访问您的应用程序。

这真的是与熵源有关的问题吗?如果是这样,在哪里 catalina.sh 这条线会去吗?

不知道是不是和entroy source有关,不过你可以把-Djava.security.egd=file:/dev/./urandom放到catalina.sh里面。在 catalina.sh 中找到 JAVA_OPTS 并用分号(;) 将其与现有值隔开。

如果您正在使用 Eclips IDE,请告诉我。这一切都很容易。 希望它会有所帮助。

【讨论】:

  • 感谢您的帮助。我仍然无法在 tomcat 上部署应用程序,但至少我找出了问题中所述问题的原因。 Netstat 是一个很好的解决方案,可以查看哪些进程正在使用哪些端口。
  • @Dan 不客气。分享您现在遇到的异常情况,查看 catalina.out 以获得更多帮助。
猜你喜欢
  • 2012-09-26
  • 2017-11-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-30
相关资源
最近更新 更多