【问题标题】:how to make jetty server accessible from LAN?如何使码头服务器可以从局域网访问?
【发布时间】:2012-08-02 05:33:10
【问题描述】:

我正在尝试使用 192.168.0.6:8080(A 的 IP)从 LAN 上的另一台机器 (B) 访问 Web 应用程序(部署在我的机器 (A) 上的 jetty8 中),但它无法正常工作。虽然我通常可以使用 192.168.0.5(B 的 IP)从 A 访问机器 B 上 AppServ 上托管​​的应用程序。

我可以在机器 A 上的 localhost:8080 上正常访问应用程序。

我可以保证没有网络问题,但由于某种原因无法通过网络访问码头。是否有任何特定配置可以通过 LAN 访问?

我的应用是 Maven 项目,我从 eclipse 运行它,设置在 web.xml 和 pom.xml 中。

【问题讨论】:

  • 你是如何启动jetty的?在 Eclipse 中,还是使用 mvn jetty:run?
  • @StefanFerstl 我已将 mvn jetty:run 添加到 eclipse 运行配置中。所以我可以从eclipse运行项目,eclipse会运行jetty。然后我可以在 localhost:8080/appName 上本地访问该应用程序
  • 您运行的操作系统是什么?您是否有任何可能阻止端口可见性的防火墙设置?
  • @Edmon 我有 windows7 .. 我关闭了 windows 防火墙但它不起作用。
  • 我无法在 Win7 上重现您的问题。如果防火墙真的关闭了,能不能看一下“网络和共享中心”?

标签: java jetty localhost maven-3 lan


【解决方案1】:

2020-07-20

作为@JoakimErdfelt answer 的补充,在 Jetty 9.4.12.v20180830(及更高版本)上,您可以以编程方式配置主机

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;

    Server server = new Server();       

    ServerConnector httpConnector = new ServerConnector(server);
        httpConnector.setHost("0.0.0.0"); // <--------- !
        httpConnector.setPort(12345);
        httpConnector.setIdleTimeout(5000);
        server.addConnector(httpConnector);

【讨论】:

    【解决方案2】:

    以下答案适用于 Jetty 8 及更早版本(Jetty 9+ 命令和类名不同)

    确保检查您正在侦听的接口。

    示例(来自日志)

    2012-08-10 14:52:26.470:INFO:oejs.AbstractConnector:Started SelectChannelConnector@127.0.0.1:8080
    

    这表示服务器只监听 127.0.0.1 (localhost) 您可以在机器 A 上查看日志,或者只是进行快速测试。 打开网络浏览器并测试这两个 URL

    • http://localhost:8080/
    • http://192.168.0.6:8080/

    如果它在两个 URL 上都有响应,那么您可能已正确设置它并需要处理防火墙问题。 如果它适用于一个,但不适用于另一个,那么你只在听 1 个接口。

    要让码头监听所有接口,请使用特殊 IP 0.0.0.0

    $ java -Djetty.host=0.0.0.0 -jar start.jar
    2012-08-10 14:53:25.338:INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:8080
    

    此时,jetty 正在侦听您机器上的所有接口。

    注意:您也可以编辑 etc/jetty.xml 并永久设置主机。

          <New class="org.eclipse.jetty.server.nio.SelectChannelConnector">
            <Set name="host">0.0.0.0</Set>
          ...
    

    【讨论】:

    • 我只能访问http://localhost:8080。我使用mvn jetty:run -Djetty.host=0.0.0.0 运行码头,它运行并得到你提到的日志SelectChannelConnector@0.0.0.0:8080。但仍然无法访问http://192.168.0.6:8080.. 还有什么可能导致问题?.. 我在本地尝试过。
    • 如果您无法访问 192.168.0.6:8080 并且您有 SelectChannelConnector@0.0.0.0:8080 输出,那么您没有 192.168.0.6 作为该计算机上的网络接口。尝试从 java 运行测试以查看它是否可以找到该网络接口。 docs.oracle.com/javase/tutorial/networking/nifs/listing.html
    • 我运行了这段代码,这是我得到的一部分:Display name: Intel(R) Centrino(R) Advanced-N 6205 Name: net5 InetAddress: /192.168.0.6 InetAddress: /fe80:0:0:0:c739:e32:3450:159f%19
    • 当 Jetty 从 Eclipse 自动启动时如何配置? (作为网络应用程序运行)
    • 注意:在带有 Google App Engine 的 Android Studio 中,您必须编辑文件 .iml。将&lt;option name="HTTP_ADDRESS" value="localhost" /&gt;这一行改为&lt;option name="HTTP_ADDRESS" value="0.0.0.0" /&gt;
    【解决方案3】:

    所以我点击了这个,在调试了一个下午的奇怪行为后,我发现 Jetty 只是将自己广播到 IPv6,并跳过 IPv4,v4 端口被分配给另一个应用程序。

    我的解决方案?跳转到另一个端口...

    【讨论】:

    • 这不是问题中发布的问题的解决方案,因为提问者明确指出可以通过 IPv4 从 localhost 访问 Jetty。
    • 不,他没有。他说他可以从机器 A 上的 localhost:8080 访问它,它可以(并且通常是)同时别名为 IPv4 (127.0.0.1) 和 IPv6 (::1) 子集。许多客户端和码头会从一个到另一个级联而不告诉你哪个正在使用/哪个已经失败,这一事实在很大程度上影响了这个问题。最有可能的是,他在 A 上的 127.0.0.1:8080 已锁定,但他的 ::1:8080 未锁定,并且码头正在使用后者。
    • 好吧,这听起来很合理。
    猜你喜欢
    • 2015-12-07
    • 1970-01-01
    • 2011-10-01
    • 2021-01-28
    • 2016-05-14
    • 2012-03-03
    • 2017-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多