Отправка html-файла с тегом <APPLET>через сокеты Java - PullRequest
2 голосов
/ 22 января 2012

У меня есть простой апплет java helloworld и html-файл с тегом, ссылающимся на этот апплет. Все это работает нормально, когда я использую сервер Apache. Клиентский компьютер обращается к порту 80 на моем сервере, вводится HTML-код с тегом апплета и апплет открыт.

Однако, если я пытаюсь отправить этот же HTML-файл через сокет Java через какой-либо другой порт для клиента, чтобы открыть его из браузера, он не работает, я получаю ошибку апплета в браузере клиентов.

Вот как я могу отправить файл, когда соединение с сокетом принято:

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

Если бы кто-нибудь мог сказать мне, что происходит или каким-либо другим способом сделать это, я был бы благодарен.

EDIT:

  1. html исходный код (это просто тег апплета):

    applet code = "MyApplet.HelloWorld" archive = "HelloWorldApplet.jar", ширина = 300, высота = 300 /

  2. Клиент должен ввести IP-адрес сервера, за которым следует ": portNo." в браузер. «192.168.1.100:4444"

  3. Да, я знаю об этом. Разве не для этого нужен апплет-тег? Мой JAR-файл помечен в HTML-файл. Если пользователь открывает html, файл jar должен быть загружен и видим в браузере клиентов. Разве это не так?

  4. Я пробую что-то на Android. Я хотел бы иметь возможность открыть апплет, который мой Android отправляет на компьютер, который находится в той же сети Wi-Fi. Это выглядело как способ сделать это. Установка какого-либо веб-сервера на Android выглядела как нежелательное осложнение, если это вообще возможно.

1 Ответ

0 голосов
/ 23 января 2012

К кому это может относиться.

Решил это.Спасибо Низет за то, что он указал мне правильное направление, до сих пор не удосужился увидеть, как работает 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();
        }

    }
}
...