使用服务器“不兼容的魔法值1013478509”启动时,Java applet失败

时间:2012-12-19 14:40:22

标签: java applet servlet-3.0

我的applet有问题。我有一个学校项目,我应该做一个乒乓球在线游戏。它运行良好离线,但当我尝试从服务器加载它时,我只得到一个带有红色文本的空框架。当我点击文字时,我收到了消息:

  

不相容的魔法值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();
    }
}

3 个答案:

答案 0 :(得分:10)

有效Java类的神奇值是0xCAFEBABE(十六进制值3405691582),这是前4个字节。但是你得到了0x3C68746D1013478509的十六进制值),它反过来代表ASCII字符<ht和{{1 }}。要自己查看,请运行以下代码:

m

这与网站提供的小程序结合使用表明它是int magic = 1013478509; ByteBuffer b = ByteBuffer.allocate(4); b.putInt(magic); System.out.println(new String(b.array())); 标记的开头,而后者又表明它是HTML文档。

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

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

答案 1 :(得分:4)

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

开头

“class”的前四个字节读取

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

打印

<htm

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

答案 2 :(得分:2)

根据Java Language Specification,正确的.class文件以幻数开头:

  

魔法物品提供识别类文件的幻数   格式;它的值为0xCAFEBABE。

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

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