从c#发送protobuf序列化对象到java服务器不起作用?

时间:2014-04-21 23:55:04

标签: c# java sockets serialization protobuf-net

我有简单的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发送的序列化邮件。即使我没有收到 任何错误。这就是我无法解决问题的原因。

2 个答案:

答案 0 :(得分:1)

&#34;问题:我没有收到序列化的消息&#34;

这个声音就像经典&#34;套接字是流&#34;问题(这里的第二个例子:http://marcgravell.blogspot.com/2013/02/how-many-ways-can-you-mess-up-io.html)。如果您已将数据写入流但尚未关闭该流,则接收流不会终止。它也不会自动知道客户端发送(比方说)应该被视为单个消息的117个字节。您有两种选择:

  • 写完后关闭出站流(仅适用于发送单个消息,不适用于两个节点之间的持续讨论)
  • 介绍某种形式的框架 - 例如长度前缀 - 以便接收方知道只尝试读取一定数量的数据,而不是尝试读取EOF(这将是如果你还没有关闭出境流,那就永远不会来。)

注意:除了&#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";       
    }