代码之家  ›  专栏  ›  技术社区  ›  Frank

当几个JavaServlet应用程序运行在同一个端口时会发生什么?

  •  2
  • Frank  · 技术社区  · 14 年前

    我的servlet发生了一些奇怪的事情,我想我已经弄明白了原因,但我更困惑了。我使用NETBEAN67开发了一个Paypal IPN(即时支付通知)消息servlet,它默认地在端口8080监听PayPal IPN消息。我从它的网站上使用了一些Java代码,但是当它运行时,只有1个10个消息通过,它们看起来是正确的,但是为什么10个中有1个呢?不是100%还是没有?

    所以我在这里问了一些问题,得到了一些建议,其中一个特别是指向谷歌的应用引擎,所以我下载了它并运行了演示留言簿,而我的ipn servlet仍在运行netbeans,奇怪的事情发生了,在我进入“app engine-java-sdk-1.3.2\bin\dev\appserver.cmd appengine-java-sdk-1.3.2\demos\guestbook\war“从命令提示符,我转到浏览器上的以下URL” http://localhost:8080/ “,我想我会看到谷歌演示留言簿页面,不,我看到的是我两年前开发的另一个servlet:“网络学院”,在线课程注册应用程序。

    怎么会这样?我从来没有开始过,而且我已经好几年没有接触过这个项目了。我猜是因为它也在监听端口8080,所以现在我明白了为什么IPN消息只有10次通过1次,因为另一个servlet也在监听那个端口,可能已经得到了打算用于IPN的消息,或者这两个servlet的进程是如何混合的,因此可以没有正确回应贝宝,失败了。为了验证我的一些猜测。

    我关闭了NetBeans,并在提示下再次运行Google留言簿,这次是在我的浏览器上。 http://localhost:8080/ 指向演示留言簿页面。

    我的网址如下:

    现在,我的问题是:

    1. 当我运行PayPal Servlet时,为什么“Web学院”Servlet是自动启动的?
    2. 如果我将IPN侦听端口更改为8083,这是否意味着我可以同时在PC上运行这两个端口而不会相互影响?
    3. 但我还是不明白,[A]和[B]看起来不一样,如果A[A]页面被刷新,它应该显示PayPal内容,另一页看着[B]应该显示Web学院内容,这正是当我启动NETBeCes运行PayPal Servlet时,两个页面都显示了它们的内容。各自内容正确并排,互不干扰,为什么IPN消息不能100%通过?
    4. 在NetBeans中,如何将8080分配给servlet[A]并将端口8083分配给servlet[B]?
    5. 如何关闭网豆网学院的自动启动?
    5 回复  |  直到 14 年前
        1
  •  3
  •   Pascal Thivent    14 年前

    你的问题中有太多问题,我不知道从哪里开始。可以肯定的是,你需要回到基础知识上来,花些时间来理解事情是如何工作的。 伺服装置 代码是否包装在 Web应用程序 它部署在 servlet容器 (服务器)。让我们看看您如何访问它们:

    http://<host>:<port>/<context>/<url-pattern>
             A      B        C           D
    

    在哪里?

    • a是运行servlet容器的计算机(主机名或IP)。
    • B是 servlet容器 正在收听(不是servlet)。
    • C是Web应用程序的路径(通常是没有 .war 扩展名,但webapp可以映射到“/”即根上下文)。
    • d是servlet映射到的URL模式。

    现在,让我们试着回答您的问题:

    当我运行PayPal Servlet时,为什么“Web学院”Servlet是自动启动的?

    我猜这个旧的应用程序仍然部署在您在NetBeans下使用的服务器上(可能是NetBeans内置服务器)。因此,当您“启动”新的应用程序(实际上是服务器)时,旧的应用程序也可以访问。

    如果我将IPN侦听端口更改为8083,这是否意味着我可以同时在PC上运行这两个端口而不会相互影响?

    正如我们所看到的,这没有意义,一个服务器正在监听一个端口,而不是一个servlet。

    但我还是不明白,[A]和[B]看起来不一样,如果A[A]页面被刷新,它应该显示PayPal内容,另一页看着[B]应该显示Web学院内容,这正是当我启动NETBeCes运行PayPal Servlet时,两个页面都显示了它们的内容。各自内容正确并排,互不干扰,为什么IPN消息不能100%通过?

    URL[A]指向paypal_应用程序的paypal_servlet。URL[b]指向映射到根上下文的Web应用程序的默认页。换句话说,两个URL都指向不同的应用程序。

    在NetBeans中,如何将8080分配给servlet[A]并将端口8083分配给servlet[B]?

    很抱歉重复一遍,但这没有意义。您很可能会更改在NetBeans中启动的服务器使用的端口,但是,两个servlet都将由同一个服务器提供服务,在新端口上运行。

    如何关闭网豆网学院的自动启动?

    我不确定,但在部署应用程序的目录中做一些清理(使用Tomcat,检查 webapps 目录)或 server.xml . 很难说,如果没有更多关于您的配置、安装内容等的详细信息。

        2
  •  4
  •   BalusC    14 年前

    第一个:servlet!=Web服务器。servlet是Java应用程序编程接口,应该在Servlet容器中运行。Servelt容器通常是Java Web服务器的一部分,比如Apache Tomcat和GalasFISH。Web服务器通常在特定端口上侦听HTTP请求。servletcontainer在启动时创建并实例化servlets。其URL与 url-pattern servlet将让servletcontainer执行servlet。

    第二:网豆!=Web服务器。NetBeans是一个集成开发环境(IDE)。它只是一个带有许多向导的开发工具,应该可以简化开发。您可以使用cmd.exe和notepad.exe以及独立的服务器和IDE进行完美的开发。你只需要 知道 你在做什么。

    至于您的实际问题:您可能以前在NetBeans中开发了“Web Academy”项目,并将其部署为有问题的Web服务器的“根”项目。GAE可能无法启动,因为该端口正由NetBeans管理的Web服务器使用(在GAE启动期间是否注意到任何错误消息?)。关闭netbeans(这有点剧烈,只关闭netbeans管理的webserver就足够了)将释放端口。

    老实说,所有这些混乱似乎都归结为你从来没有单独学习过基本的Java/Servlet概念,并立即在深孔中用一个一个整体的IDE潜水,在那里你必须在一个地方完全学习1000个不同的东西,并假设它是“唯一的RILE”。去做这件事的地方。我强烈建议暂停一下,然后逐个重新开始学习基本概念。买几本好书,花点时间把它买好。分别学习JavaSE。单独学习servlet。单独学习网豆。单独学习Web服务器。等等。然后做数学。祝你好运。

        3
  •  1
  •   duffymo    14 年前

    servlet被映射到唯一的URL,其中包括端口,所以让几个servlet监听相同的端口号是完全可以的。当一个Web上下文中有多个servlet/jsp与一个URL相关联时,这种情况很常见。

    上下文的URL通常如下所示:

    http://host:port/context-name
    

    在您的情况下,主机是本地主机,端口是8080。但是上下文名称是“paypal-app”,一个是“paypal-app”,另一个是“根”。我认为对于其他应用程序使用另一个上下文(如“demo”)而不是根上下文是明智的。你的应用不属于那里。

        4
  •  1
  •   Jeremy    14 年前

    不能将端口分配给servlet。将端口分配给servlet容器(Tomcat、Jetty、Glassfish、JBoss等)。servlet只是 javax.servlet.Servlet 不是整个服务器。

    如果您希望在一个服务器中运行多个servlet,您可以创建一个servlet(我认为您需要扩展 javax.servlet.http.HttpServlet )并在 web.xml 为您的申请。只要你的七分之一的名字不冲突,你应该是好的。

        5
  •  1
  •   TMN    14 年前

    我猜想,要么您有一个外部运行的servlet容器,只需配置NB来使用它,要么您已经导入了所有旧的NB项目,并且它们都以某种方式进行了部署。你看到注册应用的原因是你没有看到你的GAE日志文件,所以你没有注意到它在端口上听不到的时候就死了。您也没有为应用程序分配唯一的URL,所以发送到根目录的请求由注册应用程序处理。没有一个解释为什么你的Paypal请求被丢弃,我会启动窥探/ WiReSARK/什么,检查你的HTTP流量。我猜你的应用程序有缺陷。检查servlet容器日志文件可能会发现一些线索。要取消部署注册应用程序,请找出应用程序服务器存储Web应用程序的位置,然后删除war文件或保存注册应用程序文件的目录。