# Einfache Applet-Servlet-Kommunikation



## d.ausstroit (30. Nov 2006)

Hai. Langsam bin ich am verzweifeln und weiß nicht mehr weiter.

Ich versuche mich gerade in das Titel-Thema einzuarbeiten und habe dazu das Beispiel www.frank-buss.de/echoservlet/ ein wenig verändert. Und nun krige ich es nicht zum laufen. Das Beispiel von der Seite läuft ohne probleme. 

Ich habe die Oberfläche im JBuilder abgebildet und den Rest, bis auf die Namen, übernommen. Nun kommt beim Drücken des Senden-Buttons die Exception

java.io.StreamCorruptedException: invalid stream header
	at java.ibjectInputStream.readStreamHeader(Unknown Source)
	at java.ibjectInputStream.<init>(Unknown Source)
	at kommtest.KommTestApp.onSendData(KommTestApp.java:150)
	at kommtest.KommTestApp.sendButton_actionPerformed(KommTestApp.java:166)
	at kommtest.TestApplet_sendButton_actionAdapter.actionPerformed(KommTestApp.java:178)
	at java.awt.Button.processActionEvent(Unknown Source)
	at java.awt.Button.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)

Hier das Applet:


```
package kommtest;

import java.awt.*;
import java.applet.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;

public class KommTestApp extends Applet {
    boolean isStandalone = false;
    //BorderLayout borderLayout1 = new BorderLayout();
    TextField inputField = new TextField();
    Label label1 = new Label();
    Label label2 = new Label();
    TextField outputField = new TextField();
    Label label3 = new Label();
    TextArea exceptionArea = new TextArea();
    Button sendButton = new Button();
    Label label4 = new Label();
    //Parameterwert holen
    public String getParameter(String key, String def) {
        return isStandalone ? System.getProperty(key, def) :
                (getParameter(key) != null ? getParameter(key) : def);
    }

    //Das Applet konstruieren
    public KommTestApp() {
    }

    //Das Applet initialisieren
    public void init() {
        try {
            jbInit();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //Initialisierung der Komponenten
    private void jbInit() throws Exception {
        this.setLayout(null);
        label1.setFont(new java.awt.Font("Dialog", Font.PLAIN, 12));
        label1.setText("Input:");
        label1.setBounds(new Rectangle(21, 43, 45, 20));
        label2.setFont(new java.awt.Font("Dialog", Font.PLAIN, 12));
        label2.setText("Output:");
        label2.setBounds(new Rectangle(21, 71, 52, 19));
        label3.setFont(new java.awt.Font("Dialog", Font.PLAIN, 12));
        label3.setText("Exception:");
        label3.setBounds(new Rectangle(21, 199, 56, 16));
        exceptionArea.setEditable(false);
        exceptionArea.setBounds(new Rectangle(95, 111, 411, 218));
        sendButton.setFont(new java.awt.Font("Dialog", Font.PLAIN, 12));
        sendButton.setLabel("Senden11");
        sendButton.setBounds(new Rectangle(427, 56, 79, 27));
        sendButton.addActionListener(new TestApplet_sendButton_actionAdapter(this));
        label4.setFont(new java.awt.Font("Dialog", Font.BOLD, 14));
        label4.setText("Applet-Servlet-Kommunikation");
        label4.setBounds(new Rectangle(176, 9, 228, 21));
        outputField.setBounds(new Rectangle(93, 71, 321, 22));
        inputField.setBounds(new Rectangle(94, 43, 320, 22));
        this.add(label1, null);
        this.add(label2, null);
        this.add(inputField, null);
        this.add(outputField, null);
        this.add(label3, null);
        this.add(exceptionArea, null);
        this.add(sendButton, null);
        this.add(label4, null);
    }

    //Applet-Information
    public String getAppletInfo() {
        return "Applet-Informationen";
    }

    //Parameter-Infos holen
    public String[][] getParameterInfo() {
        return null;
    }
    /**
     * Get a connection to the servlet.
     */
    private URLConnection getServletConnection()
            throws MalformedURLException, IOException {

            // Connection zum Servlet öffnen
            System.out.println(getCodeBase());
            URL urlServlet = new URL(getCodeBase(), "kommtest");
            URLConnection con = urlServlet.openConnection();
            System.out.println(urlServlet);

            // konfigurieren
            con.setDoInput(true);
            con.setDoOutput(true);
            con.setUseCaches(false);
            con.setRequestProperty(
                    "Content-Type",
                    "application/x-java-serialized-object");
            //con.setRequestProperty("Content-Type", "text/xml");

            // und zurückliefern
            return con;
    }

    /**
     * Send the inputField data to the servlet and show the result in the outputField.
     */
    private void onSendData() {
            try {
                    // get input data for sending
                    String input = inputField.getText();

                    // send data to the servlet
                    System.out.println(input);
                    URLConnection con = getServletConnection();
                    System.out.println(con);
                    OutputStream outstream = con.getOutputStream();
                    System.out.println("nach 136");
                    ObjectOutputStream oos = new ObjectOutputStream(outstream);
                    System.out.println("nach 138");
                    oos.writeObject(input);
                    System.out.println("nach 140");
                    oos.flush();
                    System.out.println("nach 142");
                    oos.close();
                    System.out.println("nach 144");

                    // receive result from servlet
                    InputStream instr = con.getInputStream();
                    System.out.println("nach 148");
                    ObjectInputStream inputFromServlet = new ObjectInputStream(instr);
                    System.out.println("nach 150");
                    String result = (String) inputFromServlet.readObject();
                    inputFromServlet.close();
                    instr.close();

                    // show result
                    outputField.setText(result);

            } catch (Exception ex) {
                    ex.printStackTrace();
                    exceptionArea.setText(ex.toString());
            }
    }

    public void sendButton_actionPerformed(ActionEvent e) {
        onSendData();
    }
}


class TestApplet_sendButton_actionAdapter implements ActionListener {
    private KommTestApp adaptee;
    TestApplet_sendButton_actionAdapter(KommTestApp adaptee) {
        this.adaptee = adaptee;
    }

    public void actionPerformed(ActionEvent e) {
        adaptee.sendButton_actionPerformed(e);
    }
}
```

Das Servlet


```
package kommtest;

import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.*;

public class KommTestServ extends HttpServlet {
    //private static final String CONTENT_TYPE = "text/html";

    //Globale Variablen initialisieren
    public void init() throws ServletException {
    }

    /**
     * Get a String-object from the applet and send it back.
     */
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
            
            System.out.println("nach 33");

            try {
                response.setContentType("application/x-java-serialized-object");
                //response.setContentType("text/html");

                    // read a String-object from applet
                    // instead of a String-object, you can transmit any object, which
                    // is known to the servlet and to the applet
                    InputStream in = request.getInputStream();
                    System.out.println("nach 43");
                    ObjectInputStream inputFromApplet = new ObjectInputStream(in);
                    String echo = (String) inputFromApplet.readObject();

                    // echo it to the applet
                    OutputStream outstr = response.getOutputStream();
                    ObjectOutputStream oos = new ObjectOutputStream(outstr);
                    oos.writeObject(echo);
                    oos.flush();
                    oos.close(); 

            } catch (Exception e) {
                    e.printStackTrace();
            }
        }
        public void doGet(HttpServletRequest req, HttpServletResponse res)
                                     throws ServletException, IOException {
          doPost(req,res); // Nur Posts moeglich
        }

    //Ressourcen bereinigen
    public void destroy() {
    }
}
```

Die vielen Outputs sind zur Kontrolle. Die Exception kommt in der Zeile "ObjectInputStream inputFromServlet = new ObjectInputStream(instr);"

Ich bin für jede Hilfe dankbar  :? 

d.ausstroit


----------



## SlaterB (30. Nov 2006)

edit: mist, wieder entfernt, 

das hier war wohl keine Lösung 
http://forum.java.sun.com/thread.jspa?threadID=532596&messageID=2570509

http://www.google.de/search?hl=de&q...stream+header+applet+servlet&btnG=Suche&meta=


----------



## d.ausstroit (30. Nov 2006)

Nein, einige Postings habe ich auch entdeckt. Aber irgendwie hilft mir das alles nicht weiter. Vielleicht kann jemand mein Beispiel mal ausprobieren.

Danke für die Hilfe


----------



## Guest (1. Dez 2006)

Das merkwürdige ist, wenn ich das Original-Beispiel von Frank Buss bei mir kompiliere geht es auch nicht. Benutze ich die Original-Klassen-Dateien, geht es. Und das macht mich verrückt.

Bitte helft mir!!!  :bahnhof:


----------



## d.ausstroit (1. Dez 2006)

Das mit User-Namen Gast war ich auch. Hatte vergessen mich anzumelden.

 :roll:  :roll:  :roll: 

d.ausstroit


----------



## d.ausstroit (2. Dez 2006)

So. Ich bin wieder ein Stück weiter gekommen. Ich habe den Tomcat zu Hause auf meinem Rechner als Stand-Alone installiert (5.5.22). Da läuft das genannte Beispiel ohne Probleme. In der Firma habe ich den Tomcat als Add-On unter XAMPP installiert. Und da kommt die besagte Fehlermeldung. Muss ich da irgend etwas an der Konfiguration anpassen?

Vielleicht hilf Euch das um mir eine Lösung zu nennen.


----------

