2010-10-25 18 views
1

Ceci est mon deuxième essai pour résoudre ce problème. Mon premier essai était here, mais peut-être mon explication de mon problème ne suffisait pas, mon problème était que l'applet a reçu l'exception:est le Java Servlet que j'ai créé dans Netbeans en ajoutant quelque chose d'étrange?

java.io.StreamCorruptedException: invalid stream header: 0A0A0A3C at 
java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:783) at 
java.io.ObjectInputStream.<init>(ObjectInputStream.java:280) 

désolé si je sonne comme un disque cassé :)

Je suis en train Pour communiquer entre une applet et une servlet sur la même machine, j'ai créé la servlet dans Netbeans en créant un nouveau projet - Java Web - Application Web et en choisissant le serveur Glassfish 3 comme serveur. Cela crée un index.jsp mais je n'ai pas vraiment besoin d'une interface de page web.

Je lance le servlet à partir de NetBeans (en appuyant sur f6) et il déploie et ouvre l'index.jsp de la servlet dans mon navigateur. Je lance ensuite l'applet (à partir d'un projet différent dans Netbeans) et essaye de me connecter. Je reçois toujours le bon vieux "en-tête de flux invalide" donc je devine que la faute réside dans quelque chose que j'ai fait dans Netbeans.

J'ai collé un code Je suppose travaille (ancien code, mais ont pas trouvé de plus récents exemples complets) Le code est manifestement volé Link

Donc à la fin, ce que je voudrais faire est de envoie un tableau Object bidimensionnel du servlet à l'applet lorsque l'applet demande le tableau à envoyer. Les exemples de code sont juste pour montrer l'en-tête de flux Invalid que je reçois.

Je pense/devine que l'applet reçoit une réponse textuelle du serveur mais je veux que la réponse soit un objet sérialisé (Juste une chaîne dans l'exemple de code), ce sera un objet [] [] plus tard, si jamais j'ai une idée.

Merci pour votre patience, gourous. :)

Code Applet (vous pouvez ignorer init() avec tout le code de mise en page):

package se.iot.recallapplet; 

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

public class RecallApplet extends Applet { 
private TextField inputField = new TextField(); 
private TextField outputField = new TextField(); 
private TextArea exceptionArea = new TextArea(); 

public void init() { 
    // set new layout 
    setLayout(new GridBagLayout()); 

    // add title 
    Label title = new Label("Echo Applet", Label.CENTER); 
    title.setFont(new Font("SansSerif", Font.BOLD, 14)); 
    GridBagConstraints c = new GridBagConstraints(); 
    c.gridwidth = GridBagConstraints.REMAINDER; 
    c.weightx = 1.0; 
    c.fill = GridBagConstraints.HORIZONTAL; 
    c.insets = new Insets(5, 5, 5, 5); 
    add(title, c); 

    // add input label, field and send button 
    c = new GridBagConstraints(); 
    c.anchor = GridBagConstraints.EAST; 
    add(new Label("Input:", Label.RIGHT), c); 
    c = new GridBagConstraints(); 
    c.fill = GridBagConstraints.HORIZONTAL; 
    c.weightx = 1.0; 
    add(inputField, c); 
    Button sendButton = new Button("Send"); 
    c = new GridBagConstraints(); 
    c.gridwidth = GridBagConstraints.REMAINDER; 
    add(sendButton, c); 
    sendButton.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      onSendData(); 
     } 
    }); 

    // add output label and non-editable field 
    c = new GridBagConstraints(); 
    c.anchor = GridBagConstraints.EAST; 
    add(new Label("Output:", Label.RIGHT), c); 
    c = new GridBagConstraints(); 
    c.gridwidth = GridBagConstraints.REMAINDER; 
    c.fill = GridBagConstraints.HORIZONTAL; 
    c.weightx = 1.0; 
    add(outputField, c); 
    outputField.setEditable(false); 

    // add exception label and non-editable textarea 
    c = new GridBagConstraints(); 
    c.anchor = GridBagConstraints.EAST; 
    add(new Label("Exception:", Label.RIGHT), c); 
    c = new GridBagConstraints(); 
    c.gridwidth = GridBagConstraints.REMAINDER; 
    c.weighty = 1; 
    c.fill = GridBagConstraints.BOTH; 
    add(exceptionArea, c); 
    exceptionArea.setEditable(false); 
} 

/** 
* Get a connection to the servlet. 
*/ 
private URLConnection getServletConnection() 
    throws MalformedURLException, IOException { 

    // Connection zum Servlet ˆffnen 
      URL urlServlet = new URL("http://localhost:8080/Event_Servlet/"); 
    URLConnection con = urlServlet.openConnection(); 

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

    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 
     URLConnection con = getServletConnection(); 
     OutputStream outstream = con.getOutputStream(); 
     ObjectOutputStream oos = new ObjectOutputStream(outstream); 
     oos.writeObject(input); 
     oos.flush(); 
     oos.close(); 

     // receive result from servlet 
     InputStream instr = con.getInputStream(); 
     ObjectInputStream inputFromServlet = new ObjectInputStream(instr); 
     String result = (String) inputFromServlet.readObject(); 
     inputFromServlet.close(); 
     instr.close(); 

     // show result 
     outputField.setText(result); 

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

Code Servlet:

package se.iot.eventservlet; 

import java.io.*; 

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

public class Event_Servlet extends HttpServlet { 

public void doPost(
    HttpServletRequest request, 
    HttpServletResponse response) 
    throws ServletException, IOException { 
    try { 
     response.setContentType("application/x-java-serialized-object"); 

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

stackTrace:

java.io.StreamCorruptedException: invalid stream header: 0A0A0A3C 
    at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:783) 
    at java.io.ObjectInputStream.<init>(ObjectInputStream.java:280) 
    at se.iot.recallapplet.RecallApplet.onSendData(RecallApplet.java:114) 
    at se.iot.recallapplet.RecallApplet.access$000(RecallApplet.java:12) 
    at se.iot.recallapplet.RecallApplet$1.actionPerformed(RecallApplet.java:48) 
    at java.awt.Button.processActionEvent(Button.java:392) 
    at java.awt.Button.processEvent(Button.java:360) 
    at java.awt.Component.dispatchEventImpl(Component.java:4714) 
    at java.awt.Component.dispatchEvent(Component.java:4544) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:635) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122) 
+0

Si vos numéros de ligne correspondent à votre applet exception. outputField.setText (résultat); est votre ligne qui lance l'exception. Je recommande de définir un point d'arrêt dans votre méthode onSendData(). Parcourez le code une ligne à la fois pour mieux comprendre la source de votre problème. – Sean

+0

Etes-vous sûr de toucher votre servlet? Pouvez-vous mettre un point d'arrêt dans votre méthode servlet.doPost? – kaliatech

+0

Merci pour les réponses, je ne peux pas regarder le code jusqu'à jeudi si, je vais mettre à jour alors. –

Répondre

1

Le Le problème était que l'applet ne pouvait pas se connecter au servlet, donc le code du servlet peut être ignoré.

je devais config Server.xml ceci:

<Context path="/servletName" docBase="servletName" debug="0" reloadable="true" 
    crossContext="true"> 
    </Context>