java - 通过 Java 套接字发送带有 <APPLET> 标记的 html 文件

标签 java html http sockets applet

我有一个简单的 java helloworld applet 和一个带有引用该 applet 的标记的 html 文件。当我使用 apache 服务器时,一切正常。客户端电脑访问我服务器的80端口,输入带有applet标签的html,打开applet。

但是,如果我尝试通过某个其他端口通过 Java 套接字发送相同的 html 文件,以便客户端从其浏览器打开它,它不起作用,我会在客户端浏览器上收到小程序错误。

这是我在接受套接字连接时发送文件的方式:

DataOutputStream out=null;
    File f=new File("C:\\Program Files\\Apache Software Foundation\\Apache2.2\\htdocs\\index.html");
    DataInputStream htmlFile;
    try {
        out = new DataOutputStream(clientSocket.getOutputStream());
        htmlFile = new DataInputStream(new FileInputStream(f));
        int len = (int) f.length();
        byte[] buf = new byte[len];
        htmlFile.readFully(buf);
        htmlFile.close();
        out.writeBytes("HTTP/1.1 200 OK\r\n");
        out.writeBytes("Content-Length: " + f.length() +"\r\n");
        out.writeBytes("Content-Type: text/html\r\n\r\n");
        out.write(buf);
    } catch (FileNotFoundException e2) {
        // TODO Auto-generated catch block
        e2.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

这是我得到的错误:

    Java Plug-in 1.6.0_30
Using JRE version 1.6.0_30-b12 Java HotSpot(TM) Client VM
User home directory = C:\Documents and Settings\Administrator
----------------------------------------------------
c:   clear console window
f:   finalize objects on finalization queue
g:   garbage collect
h:   display this help message
l:   dump classloader list
m:   print memory usage
o:   trigger logging
q:   hide console
r:   reload policy configuration
s:   dump system and deployment properties
t:   dump thread list
v:   dump thread stack
x:   clear classloader cache
0-5: set trace level to <n>
----------------------------------------------------


java.net.MalformedURLException: unknown protocol: c
    at java.net.URL.<init>(Unknown Source)
    at java.net.URL.<init>(Unknown Source)
    at sun.plugin.util.GrayBoxPainter.setProgressFilter(Unknown Source)
    at sun.plugin2.applet.Plugin2Manager.setupGrayBoxPainter(Unknown Source)
    at sun.plugin2.applet.Plugin2Manager.access$700(Unknown Source)
    at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
exception: name.
java.lang.IllegalArgumentException: name
    at sun.plugin2.applet.Applet2ClassLoader.addJar(Unknown Source)
    at sun.plugin2.applet.Applet2Manager.loadJarFiles(Unknown Source)
    at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Exception: java.lang.IllegalArgumentException: name
java.net.MalformedURLException: unknown protocol: c
    at java.net.URL.<init>(Unknown Source)
    at java.net.URL.<init>(Unknown Source)
    at sun.plugin.util.GrayBoxPainter.setProgressFilter(Unknown Source)
    at sun.plugin2.applet.Plugin2Manager.setupGrayBoxPainter(Unknown Source)
    at sun.plugin2.applet.Plugin2Manager.access$700(Unknown Source)
    at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
exception: name.
java.lang.IllegalArgumentException: name
    at sun.plugin2.applet.Applet2ClassLoader.addJar(Unknown Source)
    at sun.plugin2.applet.Applet2Manager.loadJarFiles(Unknown Source)
    at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Exception: java.lang.IllegalArgumentException: name
java.lang.ClassFormatError: Incompatible magic value 1013018736 in class file MyApplet/HelloWorld
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClassCond(Unknown Source)
    at java.lang.ClassLoader.defineClass(Unknown Source)
    at java.security.SecureClassLoader.defineClass(Unknown Source)
    at sun.plugin2.applet.Applet2ClassLoader.findClass(Unknown Source)
    at sun.plugin2.applet.Plugin2ClassLoader.loadClass0(Unknown Source)
    at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source)
    at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.plugin2.applet.Plugin2ClassLoader.loadCode(Unknown Source)
    at sun.plugin2.applet.Plugin2Manager.createApplet(Unknown Source)
    at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Exception: java.lang.ClassFormatError: Incompatible magic value 1013018736 in class file MyApplet/HelloWorld

如果有人能告诉我这是怎么回事或其他方法,我将不胜感激。

编辑:

  1. html 源代码(只是 aapplet 标签):

    小程序代码=“MyApplet.HelloWorld”archive=“HelloWorldApplet.jar”,width=300,height=300/

  2. 客户端应该输入服务器 ip 地址,后跟“:portNo”。进入浏览器。 “192.168.1.100:4444”

  3. 是的,我知道了。这不是applet 标签的用途吗。我的 jar 文件被标记在 html 文件中。如果用户打开 html,则应下载 jar 文件并在客户端浏览器中显示。这不是它的工作原理吗?

  4. 我正在 android 上尝试一些东西。我希望能够打开我的 android 在同一 wifi 网络上的计算机上发送的小程序。这看起来像这样做的方法。如果可能的话,在 android 上安装一些网络服务器似乎是一个不必要的复杂化。

最佳答案

它可能与谁有关。

设法解决这个问题。感谢 Nizet 为我指明了正确的方向,直到现在才真正费心去了解 http 是如何工作的。所以最后的重点是模拟 http 如何处理 java 小程序。通过查看加载普通小程序时的请求和响应,我发现在浏览器加载 html 文件后,它会发送对引用的 jar 文件的请求 (GET/HelloWorldApplet.jar HTTP/1.1 ) 然后我必须在这样的 http 响应中返回:

 HTTP/1.1 200 OK
 Content-Length: fileLength
 Content-Type: application/java-archive

 Then send jar file as byte buffer.

全类同学:

public class MyThread extends Thread{
    Socket clientSocket;
    public MyThread(Socket socket){
        this.clientSocket=socket;
    }
    public void run(){

        System.out.println("Connection established!");

        DataOutputStream out=null;
        File h=new File("index.html");
        File j=new File("HelloWorldApplet.jar");
        DataInputStream htmlFile;
        DataInputStream jarFile;
        BufferedReader br=null;
        try {
            br=new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            out = new DataOutputStream(clientSocket.getOutputStream());
            htmlFile = new DataInputStream(new FileInputStream(h));
            jarFile=new DataInputStream(new FileInputStream(j));
            int hlen = (int) h.length();
            int jlen=(int) j.length();
            byte[] hbuf = new byte[hlen];
            byte[] jbuf = new byte[jlen];
            htmlFile.readFully(hbuf);
            jarFile.readFully(jbuf);
            htmlFile.close();
            jarFile.close();
            String request=br.readLine();
            System.out.println(request);
            if(request.startsWith("GET / HTTP/1.1")){
                out.writeBytes("HTTP/1.1 200 OK\r\n");
                out.writeBytes("Content-Length: " + h.length() + "\r\n");
                out.writeBytes("Content-Type: text/html\r\n\r\n");
                out.write(hbuf);
            }
            if(request.startsWith("GET /HelloWorldApplet.jar HTTP/1.1")){
                out.writeBytes("HTTP/1.1 200 OK\r\n");
                out.writeBytes("Content-Length: " + j.length() + "\r\n");
                out.writeBytes("Content-Type: application/java-archive\r\n\r\n");
                out.write(jbuf);
            }
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch(NullPointerException e){
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        try {
            out.close();
            clientSocket.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}

关于java - 通过 Java 套接字发送带有 <APPLET> 标记的 html 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8961043/

相关文章:

java - 如何将配置设置注入(inject) Autowiring 的 spring bean?

html - 在 Bootstrap 3 中获取垂直对齐的图像

html - div 高度为 100% 但带有标题行的 Div?

c# - 使用 HttpListener 处理范围请求

Flutter Web Http 错误 : Uncaught (in promise) Error: XMLHttpRequest error

reactjs - 根据 http 请求在按钮元素上 react 加载动画

java - 无法使用 pdfbox 打印任何内容

java - Spring 数据 Jpa : Multiple ContainingIgnoreCase

java - 重构ArrayList写入文件

javascript - 如何将数据/变量从 file_controller.rb 传递到 application.js