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

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

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

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

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

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

有效Java类的神奇值是0xCAFEBABE (hex值3405691582 ),这是前4个字节。 但是你得到0x3C68746D (hex值1013478509 ),它反过来代表ASCII字符<htm 。 要自己查看,请运行以下代码:

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

这与网站提供的applet相结合,表明它是标签的开头,而这反过来表明它是一个HTML文档。

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

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

这意味着你有一个扩展名为.class的文件,它不是一个类。 所有类都必须以幻数0xCAFEBABE

你的“类”的前四个字节读取

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

版画

  

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