java.io.StreamCorruptedException: invalid stream en-tête: 7371007E
J'ai un client du Serveur d'applications qui communiquent à l'aide d'objets.
lorsque j'envoie un seul objet de la part du client au serveur tout fonctionne bien.
lorsque je tente d'envoyer plusieurs objets l'un après l'autre sur le même flux-je obtenir
StreamCorruptedException.
Peut quelqu'un m'orienter vers la cause de cette erreur?
client la méthode d'écriture
private SecMessage[] send(SecMessage[] msgs)
{
SecMessage result[]=new SecMessage[msgs.length];
Socket s=null;
ObjectOutputStream objOut =null;
ObjectInputStream objIn=null;
try
{
s=new Socket("localhost",12345);
objOut=new ObjectOutputStream( s.getOutputStream());
for (SecMessage msg : msgs)
{
objOut.writeObject(msg);
}
objOut.flush();
objIn=new ObjectInputStream(s.getInputStream());
for (int i=0;i<result.length;i++)
result[i]=(SecMessage)objIn.readObject();
}
catch(java.io.IOException e)
{
alert(IO_ERROR_MSG+"\n"+e.getMessage());
}
catch (ClassNotFoundException e)
{
alert(INTERNAL_ERROR+"\n"+e.getMessage());
}
finally
{
try {objIn.close();} catch (IOException e) {}
try {objOut.close();} catch (IOException e) {}
}
return result;
}
serveur méthode de lecture
//in is an inputStream Defined in the server
SecMessage rcvdMsgObj;
rcvdMsgObj=(SecMessage)new ObjectInputStream(in).readObject();
return rcvdMsgObj;
et la SecMessage Classe est
public class SecMessage implements java.io.Serializable
{
private static final long serialVersionUID = 3940341617988134707L;
private String cmd;
//... nothing interesting here , just a bunch of fields , getter and setters
}
- J'ai formaté un peu pour des raisons de lisibilité - vous pouvez mettre en forme des blocs de code à l'aide de l' (101 010) bouton.
Vous devez vous connecter pour publier un commentaire.
Si vous envoyez plusieurs objets, il est souvent plus simple de mettre une sorte de détenteur/de la collection comme un
Object[]
ouList
. Il vous évite d'avoir explicitement vérifier pour la fin du flux et prend soin de transmettre explicitement le nombre d'objets dans le flux.EDIT: Maintenant que j'ai formaté le code, je vois que vous avez déjà les messages dans un tableau. Il suffit d'écrire le tableau à l'objet courant, et lire le tableau sur le côté serveur.
Votre serveur "méthode de lecture" est seulement à la lecture d'un objet. Si elle est appelée plusieurs fois, vous obtiendrez une erreur, puisqu'il est en train d'essayer d'ouvrir plusieurs objets courants de la même flux d'entrée. Cela ne fonctionnera pas, puisque tous les objets ont été écrits sur le même flux d'objet sur le côté client, de sorte que vous avez à miroir de cette disposition sur le côté serveur. C'est, utiliser un objet de flux d'entrée et de lire plusieurs objets à partir de ce.
(L'erreur que vous obtenez est parce que le objectOutputStream écrit un en-tête, qui est attendu par la objectIutputStream. Comme vous n'êtes pas à l'écriture de plusieurs cours d'eau, mais simplement de multiples objets, alors la prochaine objectInputStream créé sur la prise d'entrée ne parvient pas à trouver un second en-tête, et lève une exception.)
De le réparer, créer la objectInputStream lorsque vous acceptez la connexion de socket. Passer cette objectInputStream à votre serveur méthode de lecture et de lecture de l'Objet à partir de cela.
En fait, votre code client est l'écriture d'un objet sur le serveur et lecture plusieurs objets à partir du serveur. Et il n'y a rien sur le côté serveur qui est écrit les objets que le client est d'essayer de lire.
Cette exception peut également se produire si vous utilisez
Socket
s sur un côté etSSLSocket
s sur l'autre. La cohérence est importante.