1

好的,所以我已经被困几天的问题是 Tomcat 不运行我的应用程序。这是我第一次接触 Tomcat 和服务器编程,所以这很可能纯粹是我的错。但是几天后我自己无法击败它,所以我决定在这里发布一个问题。

我试过运行很多不同的设置,但现在我是最简单的一个,但仍然无法弄清楚。所以,我已经安装了:Eclipse IDE 1.5.0(Eclipse 平台 4.2.0),WST 3.4.1,Tomcat 7.0.12 通过 Eclipse 安装(也试过 7.0.30)。

我已经在 eclipse 中配置好 tomcat 服务器,所以当我运行它时 - 它确实按预期工作。

但是后来我得到了这段简单的代码,我从 oracle 的服务器套接字指南中获得:

import java.net.*;
import java.io.*;

import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Logger;


public class KnockKnockServer {
    private static final Logger logger = Logger.getRootLogger();

    public static void main(String[] args) throws IOException {
        BasicConfigurator.configure();
        ServerSocket serverSocket = null;
        try {
            serverSocket = new ServerSocket(4444);
            logger.debug("Socket opened");
            System.err.println("Port opened");
        } catch (IOException e) {
            logger.debug("Could not listen on port: 4444.");
            System.err.println("Port not opened");
            System.exit(1);
        }

        Socket clientSocket = null;
        try {
            clientSocket = serverSocket.accept();
            logger.info("socket accepted");
        } catch (IOException e) {
            logger.info("Accept failed.");
            System.exit(1);
        }

        PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
        BufferedReader in = new BufferedReader(
                new InputStreamReader(
                clientSocket.getInputStream()));
        String inputLine, outputLine;
        KnockKnockProtocol kkp = new KnockKnockProtocol();

        outputLine = kkp.processInput(null);
        out.println(outputLine);

        while ((inputLine = in.readLine()) != null) {
             outputLine = kkp.processInput(inputLine);
             out.println(outputLine);
             if (outputLine.equals("Bye."))
                break;
        }
        out.close();
        in.close();
        clientSocket.close();
        serverSocket.close();
    }
}

当我执行“运行方式-> 在服务器上运行”启动时,这不起作用。我尝试将它添加到 WAR 并进行部署,但它产生了相同的结果 - 没有。这意味着我既不能使用另一个客户端应用程序(来自另一个 Eclipse 实例)连接到它,也不能产生任何表明它有效的消息(仅访问由 tomcat 生成的日志)。如您所见,我将 log4j 添加到代码中,以查看任何证明代码实际上在服务器上运行的消息(最初只有 System.err 和 System.out),我尝试配置控制台输出和文件输出。

同样,服务器本身按预期运行——我可以通过浏览器访问它、打开管理器应用程序、部署/取消部署应用程序等。

所以问题是:我做错了什么?我认为可能存在一些原始错误/未完成的步骤/无论我犯了什么,但在谷歌的帮助下,我在 2 天的战斗中无法弄清楚。

帮助将不胜感激。

更新:非常感谢大家!正如我所怀疑的那样 - 愚蠢的我 :) 不知道为什么我开始使用 Tomcat,但是是的,运行为应用程序工作正常。这些即时答案为我节省了很多时间。再次非常感谢。

4

4 回答 4

3

我认为这里有一个误解。Tomcat 是一个 servlet 容器 - 它旨在运行由servlet组成的 Web 应用程序。

KnockKnockServer是一个普通的 Java 应用程序,因此“在 Tomcat 上”运行它绝对没有意义。您应该将其作为独立应用程序运行。

实际上,有时在 Tomcat 上运行的 Web 应用程序中为某些特定协议启动服务器是有意义的。在这种情况下,您需要控制自定义服务器的生命周期ServletContextListener。但我不认为这是你的情况。

于 2012-10-02T12:42:54.110 回答
1

尝试将其作为 java 应用程序运行。不是作为 Web 应用程序。它似乎不是 Java Web 应用程序

于 2012-10-02T12:49:09.430 回答
0

您尝试使用主类打开套接字。您不应该在服务器上运行您的应用程序,您的应用程序将是服务器本身。单击运行方式 > 运行方式应用程序。

于 2012-10-02T12:42:32.183 回答
0

Tomcat 是一个 servlet 容器。用于运行 Web 应用程序。您正在尝试在容器中运行 java 类,这是不可能的。尝试将其作为独立应用程序运行。

于 2012-10-02T13:10:31.717 回答