“StreamCorruptedException: invalid stream en-tête” lors de la lecture de ObjectInputStream envoyé à partir de C# client
Problème
Je suis en train d'envoyer un protobuf message à partir d'un client C# ce Serveur Java, mais j'ai cette exception:
java.io.StreamCorruptedException: invalid stream header: 0A290A08
java.io.StreamCorruptedException: invalid stream header: 0A290A08
at java.io.ObjectInputStream.readStreamHeader(Unknown Source)
at java.io.ObjectInputStream.<init>(Unknown Source)
Je suis un peu à une perte pour être honnête. Toute aide est appréciée. Merci!
- Java server
public ControllerThread(Socket s){
this.s = s; try {
this.objectInputStream = new ObjectInputStream(s.getInputStream());
byte size = objectInputStream.readByte();System.out.println("Server: BYTES SIZE:" + size);
byte[] bytes = new byte[size];
objectInputStream.readFully(bytes);
AddressBook adb = AddressBook.parseFrom(bytes);
System.out.println("Server: Addressbook:" + adb.getPersonCount());
} catch (IOException e) {
System.out.println("Server: BufferedReader oder PrintWriter von ThermoClient konnte nicht erstellt werden");
e.printStackTrace(); }
} }
De code C#
public AddressBook InitializeAdressBook()
{
Person newContact = new Person();
AddressBook addressBookBuilder = new AddressBook();
Person john = new Person();
//john.id=1234;
john.name="John Doe";
john.email="[email protected]";
Person.PhoneNumber nr = new Person.PhoneNumber();
nr.number="5554321";
john.phone.Add(nr);
addressBookBuilder.person.Add(john);
TextBox.Text += ("Client: Initialisiert? " + addressBookBuilder.ToString()) + "\t" + "\n";
TextBox.Text += " Erster Person " + addressBookBuilder.person.First().name + "\t" + "\n";
return addressBookBuilder;
}
c# OutputStream
public void SendMessage(Stream ns, byte[] msg)
{
byte size = (byte)msg.Length;
try
{
ns.WriteByte(size);
ns.Write(msg, 0, msg.Length);
ns.Flush();
ns.Close();
}
catch (ArgumentNullException ane)
{
TextBox.Text += "ArgumentNullException : {0}" + ane.ToString();
}
catch (Exception e)
{
TextBox.Text += ("Unexpected exception : {0}" + e.ToString());
}
}
Java est ObjectInputStream est probablement une bonne chose seulement pour java-java communication. Pour C# pour parler de Java, vous aurez besoin d'une plate-forme neutre protocole.
comment était le message généré? Et comment était-il écrit à la prise de courant? Une possibilité est que vous avez réellement corrompu.
il a été écrit comme un tableau d'octets. pourrais-je l'utiliser ObjectInputStream avec c# client?
Merci de poster utile code C# .. les trucs que a écrit les données à la sortie de flux en C#. Ce problème n'est pas lié à ProtocolBuffers. Voir le message d'erreur. Je suis en train de aide la question, en y incluant un approprié titre. Le problème [rapporté] est pas liées à ProtocolBuffers. Essayez d'envoyer et de recevoir des "juste un int" pour voir.
Le code c# vous post n'est pas de montrer combien vous obtenez alors que sur le socket. Je suis heureux de vous aider (à la fois protobuf et socket-les serveurs sont très familiers), mais il est impossible de diagnostiquer une incompatibilité, sauf si vous pouvez voir les deux extrémités du tuyau. Je suis à la recherche de code:: sérialise le carnet d'adresses d'entrée, b: ajoute le préfixe de longueur d'en-tête, et c: comment le outut de a et de b obtenir déposée sur le socket raw.
comment était le message généré? Et comment était-il écrit à la prise de courant? Une possibilité est que vous avez réellement corrompu.
il a été écrit comme un tableau d'octets. pourrais-je l'utiliser ObjectInputStream avec c# client?
Merci de poster utile code C# .. les trucs que a écrit les données à la sortie de flux en C#. Ce problème n'est pas lié à ProtocolBuffers. Voir le message d'erreur. Je suis en train de aide la question, en y incluant un approprié titre. Le problème [rapporté] est pas liées à ProtocolBuffers. Essayez d'envoyer et de recevoir des "juste un int" pour voir.
Le code c# vous post n'est pas de montrer combien vous obtenez alors que sur le socket. Je suis heureux de vous aider (à la fois protobuf et socket-les serveurs sont très familiers), mais il est impossible de diagnostiquer une incompatibilité, sauf si vous pouvez voir les deux extrémités du tuyau. Je suis à la recherche de code:: sérialise le carnet d'adresses d'entrée, b: ajoute le préfixe de longueur d'en-tête, et c: comment le outut de a et de b obtenir déposée sur le socket raw.
OriginalL'auteur Kaiser4you | 2012-11-01
Vous devez vous connecter pour publier un commentaire.
tldr; Le problème est à l'aide de
ObjectInputStream (Java)
qui ne fonctionne que avec les données générées parObjectOutputStream (Java)
. Dans ce cas, leStreamCorruptedException
est générée car le flux est donné invalide de données qui a été pas généré parObjectOutputStream (Java)
.Au lieu de cela, utiliser
DataInputStream (Java)
pour lire les données générées parBinaryWriter (C#)
. Ces deux prennent uniquement en charge "primitive". Tant que le corriger endianess est utilisé et signe de la farce est effectuée selon les besoins: des entiers, des flotteurs, en double (mais pas de Décimales), et des tableaux d'octets peut être envoyé en toute sécurité de cette façon.ObjectInputStream (Java)
:DataInputSteam (Java)
:BinaryWriter (C#)
:Notes:
char/character
,short
,int
,long
,float
, etdouble
les types de données qu'ils ont la même signé la nature et au niveau du bit de la représentation en C# et Java.byte (Java, signed)
vsbyte (C#, unsigned)
. Heureusement, ProtocolBuffer va automatiquement gérer cette si labyte[] (Java or C#)
.OriginalL'auteur
Donc, avec cette c# OutputStream méthode et DataInputStream ( Java) au lieu ObjectOutputSteam il fonctionne sans aucun problème
Notes:
- Je obtenir EndianBinaryWriter et EndianBitConverter de MiscUtil.
OriginalL'auteur Kaiser4you