1

さて、私がすでに数日間立ち往生している問題は、Tomcat が私のアプリケーションを実行しないということです。これは、Tomcat とサーバー プログラミング全体との初めての出会いなので、純粋に私のせいである可能性が最も高いです。しかし、数日で自分で打ち負かすことができなくなったので、ここに質問を投稿することにしました.

かなり多くの異なるセットアップを実行しようとしましたが、今は最も簡単なセットアップであり、まだ理解できません. それで、私はインストールしました:Eclipse IDE 1.5.0(Eclipseプラットフォーム4.2.0)、WST 3.4.1、Eclipseを介してインストールされたTomcat 7.0.12(7.0.30も試しました)。

Tomcat サーバーが Eclipse で正常に構成されているので、実行すると意図したとおりに動作します。

しかし、サーバーソケットに関するオラクルのガイドから取得したこの簡単なコードを取得しました。

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();
    }
}

「Run As -> Run on server」を起動しても機能しません。WARに追加して展開しようとしましたが、同じ結果が得られます-なし。つまり、別のクライアントアプリを使用して(別のEclipseインスタンスから)接続することも、動作を示すメッセージを生成することもできません(Tomcatによって生成されたログにのみアクセスします)。ご覧のとおり、コードに log4j を追加して、コードがサーバー上で実際に実行されていることを証明するメッセージを確認しました (最初は System.err と System.out だけでした)。これをコンソール出力とファイル出力の両方に設定してみました。

繰り返しますが、サーバー自体は意図したとおりに実行されます。ブラウザーからアクセスしたり、マネージャー アプリを開いたり、アプリを展開/展開解除したりできます。

質問は次のとおりです。私は何を間違っていますか? 原始的な間違い/元に戻したステップ/私が作ったものがあるかもしれないと思いますが、Googleの助けを借りて2日間戦ってもそれを理解できませんでした.

助けていただければ幸いです。

更新:どうもありがとうございました! 私が疑ったように-愚かな私:)なぜTomcatでこの混乱を始めたのかわかりませんが、ええ、Run as Applicationは正常に動作します. これらの即時の回答により、多くの時間を節約できました。どうもありがとうございました。

4

4 に答える 4

3

ここに誤解があると思います。Tomcat はサーブレット コンテナーです。サーブレットで構成される Web アプリケーションを実行するためのものです。

KnockKnockServerこれは通常の Java アプリケーションであるため、「Tomcat で」実行してもまったく意味がありません。代わりに、スタンドアロン アプリケーションとして実行する必要があります。

実際、Tomcat で実行される Web アプリケーション内で特定のプロトコル用にサーバーを起動することが理にかなっている場合があります。この場合、カスタム サーバーのライフサイクルを から制御する必要がありますServletContextListener。しかし、それはあなたの場合ではないと思います。

于 2012-10-02T12:42:54.110 に答える
1

Javaアプリケーションとして実行してみてください。Webアプリケーションとしてではありません。JavaWebアプリケーションではないようです

于 2012-10-02T12:49:09.430 に答える
0

メイン クラスでソケットを開こうとしています。サーバー上でアプリケーションを実行しないでください。アプリケーションはサーバー自体になります。[実行] > [アプリケーションとして実行] をクリックします。

于 2012-10-02T12:42:32.183 に答える
0

Tomcat はサーブレット コンテナーです。Web アプリケーションを実行するためのものです。コンテナで Java クラスを実行しようとしていますが、これは不可能です。スタンドアロン アプリケーションとして実行してみてください。

于 2012-10-02T13:10:31.717 に答える