【问题标题】:How to serve HTTP content from a port in Java如何从 Java 中的端口提供 HTTP 内容
【发布时间】:2020-11-11 05:51:07
【问题描述】:

当我通过在其 bin/ 目录中执行批处理文件来运行 ActiveMQ 时,我可以通过打开 Web 浏览器并转到 http://localhost:8161/admin/ 来访问其管理/管理控制台。

这让我很好奇。

这是我的本地沙箱,我没有安装任何网络服务器(httpd 或其他)。那么 ActiveMQ 是如何能够在我的机器上“注册”一个端口并专门监听它的呢?

如果我尝试转到 http://localhost:8162/admin/(注意不同的端口号),我会收到 无法连接 错误。

不知何故,AMQ 说“将这个 URI (localhost:8161) 映射到这台机器上的某个根目录”。作为一名程序员,我对这样的事情是如何工作的很感兴趣。

【问题讨论】:

  • 您认为httpd 是如何做到的,为什么 ActiveMQ 不能做到这一点?

标签: java network-programming port activemq


【解决方案1】:

Java 进程可以使用任何端口(Linux 上>= 1024)作为 Web 服务器或用于任何其他目的。您不需要单独的网络服务器来执行此操作

【讨论】:

  • Java 完全能够使用端口
  • 您只是以 root 身份运行。 ;)
【解决方案2】:

我建议您阅读套接字:here。 Web 服务器就是一个处理 HTTP 协议的套接字侦听器。 HTTP 协议为here

Web 服务器通常处理很多其他事情,但这是基础。如果您想要一个还运行 Web 服务器的小程序,我建议不要重新发明轮子。尝试将jetty 合并到您的服务器中。

【讨论】:

  • 我正计划设置一个 GlassFish 服务器。我可以只配置 GF 为我侦听某个端口,然后(以某种方式)将该端口上的 HTTP 请求映射到我的 servlet 吗?
  • 我对 glassfish 配置不是很熟悉,不过我可以通过 google 找到以下内容:docs.oracle.com/cd/E18930_01/html/821-2427/ghmos.html#gkrgo
  • 感谢 DMoses 花时间解释幕后发生的事情,并为我找到了参考!
【解决方案3】:

ActiveMQ 启动一个嵌入的Jetty server,它侦听该端口上的 HTTP 连接。您不需要运行任何其他服务器。这一切都是从Java完成的。如果你深入挖掘,你会在这一切的底部找到各种各样的ServerSocket。您可以在Java Tutorial 中了解有关套接字和监听端口的所有信息。

【讨论】:

  • 谢谢瑞恩 - 你能读一下我对 DMoses 回复的评论吗?同样的问题:我可以设置一个 GlassFish 服务器来为我做这件事吗?
  • @Adam:不太清楚你在找什么。我认为您所要求的正是构建 servlet 容器的目的。在这种情况下,JettyTomcat、Glassfish(实际上是Grizzly)、Winstone 或众多商业产品中的任何一个都将几乎相同地工作——绑定到端口、接收 HTTP 请求和让您使用servlet 创建回复。
【解决方案4】:

在最简单的层面上,ActiveMQ 在自身内部创建一个 ServerSocket 实例,并使用该服务器套接字侦听连接。套接字始终绑定到端口。

【讨论】:

    【解决方案5】:

    一:这个端口大于(或等于)1024,所以这意味着一个“非root”用户可以监听它。

    第二:您只能从专用地址绑定到端口。这意味着 ActiveMQ 可能只在 127.0.0.1 (localhost) 上打开了该端口。试试看您是否可以从外部接口的 IP 地址打开该 URL:您可能不能。

    如果你是Unix系统下,你可以通过netstat -ltpn查看哪个程序监听哪个端口。

    绑定到端口的基本系统调用是listen(2)

    【讨论】:

      猜你喜欢
      • 2010-12-08
      • 2012-06-26
      • 2018-06-27
      • 2015-03-13
      • 1970-01-01
      • 2016-08-01
      • 1970-01-01
      • 2011-02-01
      • 2018-07-07
      相关资源
      最近更新 更多