2010-06-02 6 views
1

Je dois envoyer un objet du client au serveur en le sérialisant.
Ceci est mon code:StreamCorruptedException, lors de l'utilisation de ObjectInputStream

 HttpURLConnection con = null; 
    ObjectOutputStream out = null; 
    ObjectInputStream inputStream = null; 

    URL servlet = new URL("MY_URL"); 
     con = (HttpURLConnection) servlet.openConnection(); 
     con.setDoInput(true); 
     con.setDoOutput(true); 
     con.setUseCaches(false); 
     con.setDefaultUseCaches(false); 
     con.setRequestProperty("Content-type", "application/octet-stream"); 
     con.setRequestMethod("POST"); 
     out = new ObjectOutputStream(con.getOutputStream()); 
     out.writeObject(myobject); 
     out.flush(); 
     out.close(); 

     inputStream = new ObjectInputStream(con.getInputStream()); 
     inputStream.close(); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 

    finally 
    { 
    // inputStream.close(); 
     con.disconnect(); 
    } 
    return true; 

Maintenant, je suis en mesure d'atteindre le Servlet, et je peux récupérer l'objet par là.
Le seul problème est que dès que j'arrive à cette ligne:

inputStream = new ObjectInputStream(con.getInputStream()); 

Je reçois un StreamCorruptedException d'exception, au côté client. (Au tout côté serveur fonctionne bien!) Et si je prends cette ligne hors tension, le servlet pas déclenché (je veux dire l'doGet() ou doPost() pas appelé dans le servlet)

Qu'est-ce que je fais mal?

Ceci est l'erreur exacte:

06-02 12:41:53.549: WARN/System.err(4260): java.io.StreamCorruptedException 
06-02 12:41:53.549: WARN/System.err(4260): java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:2399) 
06-02 12:41:53.549: WARN/System.err(4260): at java.io.ObjectInputStream.<init>(ObjectInputStream.java:447) 

Merci,
Ray

+0

Quelle est l'erreur exacte? –

+0

Editer la question – rayman

Répondre

4

Le client attend que le servlet écrit un objet à la réponse quelque chose comme:

ObjectOutputStream oos = new ObjectOutputStream(response.getOutputStream()); 
oos.writeObject(someObject); 

Mais le servlet ne semble effectivement pas écrire un objet en arrière. Donc, le client ne doit pas le décorer avec un ObjectInputStream. Il suffit de le faire:

InputStream inputStream; 
// ... 
inputStream = connection.getInputStream(); 

ou simplement

connection.connect(); 

si vous n'êtes pas intéressé par la réponse de toute façon. La connexion est exécutée sur demande uniquement. Le getInputStream() le fera implicitement. C'est pourquoi la demande n'a pas été renvoyée avant que vous n'appelez getInputStream(). Voir également this answer pour plus de conseils.

+0

connection.connect(); , n'a pas déclenché l'autre côté mais InputStream inputStream; // ... inputStream = connection.getInputStream(); fait le travail parfaitement. merci. – rayman

+0

@BalusC Ici, je dois remplacer oos avec flux d'entrée ah? suis confronté à la même erreur et mon code est ByteArrayOutputStream baos = nouveau ByteArrayOutputStream(); ObjectOutputStream os = new ObjectOutputStream (baos); os.writeObject (sérialisable); os.reset(); os.close(); – AndroidOptimist

0

Ne pas faire ce genre de choses vous-même, regardez HttpClient et HttpInvoker du printemps.

+0

C'était une réponse sérieuse, j'ai commencé à écrire une application client/serveur exactement comme celle ci-dessus. Et quand j'ai découvert HttpInvoker, j'ai réalisé ma folie; Je ne reviendrai jamais. – Justin

+0

Regardez ** Last Words ** dans la réponse de BalusC. – Justin

+0

J'ai contré le downvote puisque votre intention est bonne. Mais vous devriez à l'avenir poster une réponse un peu plus étendue. Juste * répondre réellement * à la question, puis fermez avec la suggestion d'utiliser Apache HttpClient, si nécessaire avec l'exemple de code comment vous pourriez le faire avec HttpClient. En ce moment vous ne répondez pas au problème de base, même pas comment le faire avec HttpClient. – BalusC