3

アプレットに問題があります。ポンオンラインゲームを作ることになっている学校のプロジェクトがあります。オフラインでは正常に実行されますが、サーバーからロードしようとすると、赤いテキストが含まれる空のフレームが表示されます。テキストをクリックすると、次のメッセージが表示されます。

互換性のない魔法の値1013478509

jetty-all-8.1.8.v20121106.jarとservlet-api-3.0.jarを使用しています

サーバーを起動するクラスは次のようになります。

public class TheServer extends HttpServlet {
    private static final long serialVersionUID = 1L; 
    private Scanner sc;
    private String webSite;
    private PrintWriter out;


    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html; charset=UTF-8");
        resp.setStatus(HttpServletResponse.SC_OK);
        out = resp.getWriter();

        sc = new Scanner(new File("F:\\Users\\Johan\\Workspace Kurs 5\\PongOnline\\bin\\pong.html"));
        webSite = "";
        while(sc.hasNext())
            webSite += sc.nextLine();
        sc.close();

        out.println(webSite);
        System.out.println(webSite);
    }

    public static void main(String...args) throws Exception {
        ServletContextHandler context = new ServletContextHandler( ServletContextHandler.SESSIONS);
        context.addServlet(TheServer.class, "/");

        Server server = new Server(666);
        server.setHandler(context);
        server.start();
        server.join();
    }
}
4

3 に答える 3

10

有効なJavaクラスの魔法の値は0xCAFEBABE(の16進値3405691582)で、これは最初の4バイトです。0x3C68746Dしかし、 (の16進値)を取得しています。これは、1013478509ASCII文字、、、<およびを表します。自分で確認するには、次のコードを実行します。htm

int magic = 1013478509;
ByteBuffer b = ByteBuffer.allocate(4);
b.putInt(magic);
System.out.println(new String(b.array()));

これは、Webサイトによって提供されるアプレットと組み合わせて、<html>タグの開始であることを示し、それがHTMLドキュメントであることを示します。

したがって、アプレットへのHTTPリクエストは、実際にはHTMLドキュメントを返したようです。ブラウザのアドレスバーで現在のリクエストURIを変更してアプレットのURLを指すようにすると、自分で確認できるはずです。次に、アプレットをダウンロードしようとしたときにブラウザが実際に何を取得したかを確認します。おそらく、それはHTMLページのフレーバーの単純なHTTP404エラードキュメントです。

<applet>これを修正するには、 or<object>タグのURLが正しいことを確認してください。ブラウザのアドレスバーに表示されるように、現在のリクエストURLを基準にしています。サーブレットの動作方法は非常に奇妙です。デプロイフォルダの外部からHTMLファイルをストリーミングしています。これは、アプレットもデプロイフォルダの外にあり、有効なURLではまったく到達できないことを示しています。HTMLページとアプレットの両方をWebコンテンツフォルダに配置する必要があります。このようにして、そのサーブレットはもう必要ありません。

于 2012-12-19T14:45:38.170 に答える
4

.classこれは、クラスではない拡張子を持つファイルがあることを意味します。すべてのクラスはマジックナンバーで始まる必要があります0xCAFEBABE

「クラス」の最初の 4 バイトが読み取られます

System.out.println(new String(BigInteger.valueOf(1013478509).toByteArray()));

版画

<htm

HTMLファイルだと思います。

于 2012-12-19T14:43:52.257 に答える
2

Java言語仕様によると 、適切な.classファイルはマジックナンバーで始まります。

マジックアイテムは、クラスファイル形式を識別するマジックナンバーを提供します。値は0xCAFEBABEです。

コンパイルされた.classファイルを16進エディタで開き、その最初のバイトを検査する場合、それらはである必要があります0xCAFEBABE1013478509ASCIIでは。に変換され<htmます。

サーバー上でクラスが適切にコンパイルされていることを確認してください。そして、おそらく、BalusCが彼の回答ですでに指摘しているように、URLが正しいことを確認してください。取得している<htm...バイトは、サーバーによって提供されるHTMLエラードキュメントである可能性があります。

于 2012-12-19T14:44:44.567 に答える