【发布时间】:2012-11-01 23:04:07
【问题描述】:
问题
我正在尝试从 C# 客户端向这个 Java 服务器发送一个 protobuf 消息,但我得到了这个异常:
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)
说实话,我有点不知所措。任何帮助表示赞赏。谢谢!
- Java 服务器
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(); }
} }
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="jdoe@example.com";
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# 输出流
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 的 ObjectInputStream 可能只适用于 java-java 通信。要让 C# 与 Java 对话,您需要一个平台中立的协议。
-
@Kaiser4you 消息是如何生成的?它是如何写入套接字的?一种可能是你真的破坏了它。
-
@MarcGravell 它被写成一个字节数组。我可以将 ObjectInputStream 与 c# 客户端一起使用吗?
-
请发布有用 C# 代码.. 将数据写入 到 C# 中适当的输出流的东西。此问题与 ProtocolBuffers 无关。请参阅错误消息。我试图通过包含一个适当的标题来帮助这个问题。 问题[报告]不与ProtocolBuffers有关。尝试发送和接收“只是一个int”来查看。
-
您发布的 c# 代码没有显示您如何将其放到套接字上。我很乐意提供帮助(protobuf 和 socket-servers 都非常熟悉),但是除非你能看到管道的两端,否则不可能诊断出不匹配。我正在寻找以下代码:a:序列化地址簿条目,b:添加长度前缀标头,以及 c:a 和 b 的输出如何放到原始套接字上。