我有简单的c#客户端应用程序,它将对象发送到基于java的服务器应用程序。 注意:我在clinet方面使用protobuf-net。对于这个应用程序,我有简单的.proto文件只有一个字段,而.java类是由protoc编译器生成的。
.Proto文件:
message Person {
required string id = 1;
}
C#客户端发送对象
MemoryStream ms = new MemoryStream();
Person per = new Person();
per.id = "TestId001";
Serializer.Serialize<Person>(ms, per);
byte[] buffer = ms.ToArray();
clientSocket.SendTo(buffer, hostEP);
基于Java的服务器接收对象
DataInputStream inputStream=new DataInputStream(socket.getInputStream());
Person person = Person.parseFrom(socket.getInputStream());
System.out.println("Id: " + person.getId());
问题:我没有收到c#app发送的序列化邮件。即使我没有收到 任何错误。这就是我无法解决问题的原因。
答案 0 :(得分:1)
&#34;问题:我没有收到序列化的消息&#34;
这个声音就像经典&#34;套接字是流&#34;问题(这里的第二个例子:http://marcgravell.blogspot.com/2013/02/how-many-ways-can-you-mess-up-io.html)。如果您已将数据写入流但尚未关闭该流,则接收流不会终止。它也不会自动知道客户端发送(比方说)应该被视为单个消息的117个字节。您有两种选择:
注意:除了&#34;套接字是流&#34;问题,还要记住protobuf消息是可附加的。一个protobuf消息本身,没有关于它结束的概念。幸运的是,上面的两个现有要点都将解决这个问题。但重要的是,你不能只在框架中将3 Person
个对象写入流中(或关闭流),然后期望能够在另一个对象中找回3 Person
个对象。结束:您将获得一个 Person
对象。在 this 场景中,最简单的选项是添加包装器对象,即
message SomeMessage {
repeated Person people = 1;
}
答案 1 :(得分:0)
尝试在C#中将这些属性添加到您的类中,并检查Java中的输入是否正常。
[ProtoContract]
class Person
{
[ProtoMember(1)]
public string id = "1";
}