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(的十六进制值3405691582),即前 4 个字节。但是你得到0x3C68746D(的十六进制值) ,1013478509它又代表 ASCII 字符<,h和. 要自己查看,请运行以下代码:tm

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

这与网站提供的小程序相结合表明它是一个<html>标签的开始,而这反过来又表明它是一个 HTML 文档。

因此,对 applet 的 HTTP 请求显然实际上返回了一个 HTML 文档。当您将浏览器地址栏中的当前请求 URI 更改为指向小程序的 URL 时,您应该能够自己看到它。然后,您将看到浏览器在尝试下载小程序时实际检索到的内容。也许它是一个 HTML 页面风格的简单 HTTP 404 错误文档。

要修复它,只需确保<applet>or<object>标记中的 URL 正确。它与您在浏览器地址栏中看到的当前请求 URL 相关。servlet 的工作方式很奇怪。您正在从部署文件夹外部流式传输 HTML 文件。这表明小程序也在部署文件夹之外,因此根本无法通过有效的 URL 访问。您应该将 HTML 页面和小程序都放在 web 内容文件夹中。这样你就不再需要那个servlet了。

于 2012-12-19T14:45:38.170 回答
4

这意味着您有一个.class扩展名为不是类的文件。所有课程都必须以幻数开头0xCAFEBABE

“类”的前四个字节读取

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

印刷

<htm

所以我怀疑这是一个 HTML 文件。

于 2012-12-19T14:43:52.257 回答
2

根据 Java 语言规范,正确的.class文件以幻数开头:

魔术项提供标识类文件格式的魔术数字;它的值是 0xCAFEBABE。

如果您.class使用十六进制编辑器打开任何已编译的文件并检查其第一个字节,它们应该是0xCAFEBABE. 1013478509在 ASCII 中转换为<htm.

确保您已在服务器上正确编译了该类。正如 BalusC 在他的回答中已经指出的那样,更有可能的是,确保 URL 是正确的。<htm您获得的... 字节可能是服务器提供的 HTML 错误文档。

于 2012-12-19T14:44:44.567 回答