当使用protobuf-net反序列化协议缓冲区时,我如何指定流长度



我正在尝试使用协议缓冲区通过TCP连接从服务器发送整数到客户端。我相信我的服务器正在向流写入内容,但是当客户端试图从网络流反序列化时,我的代码无限期地暂停。我的直觉告诉我,客户端不知道流的长度,所以它不知道何时读取完成,但是反序列化方法没有长度的输入,所以我不确定如何实现这一点。下面是我的原型定义、服务器和客户端的代码。

原型定义

Public Class Proto
<ProtoContract()>
Public Class TCP
    <ProtoMember(1)>
    Public Property Command As Integer
End Class
End Class

服务器代码
    Dim commandStuff As New Proto.TCP
    Console.WriteLine("Enter command number")
    commandStuff.Command = Console.ReadLine()

    Dim myIP As IPAddress = IPAddress.Parse("my address")
    Dim myServer As New TcpListener(myIP, 800)
    myServer.Start() 'starts listening,
    Console.WriteLine("Waiting for connection")
    Dim myClient As TcpClient = myServer.AcceptTcpClient() 'Accepts client,  pauses program until finds a client
    Console.WriteLine("Connected")
    Dim myStream As NetworkStream = myClient.GetStream
    ProtoBuf.Serializer.Serialize(Of Proto.TCP)(myStream, commandStuff) 'write the instance commandStuff to the stream myStream
    Console.WriteLine("Stuff has been written")
    Console.ReadLine()

这段代码完全运行没有任何问题

客户机代码

    Dim IP As IPAddress
    IP = IPAddress.Parse("my address")
    Dim myClient As New TcpClient
    myClient.Connect(IP, 800)
    Console.WriteLine("Connected")
    Dim myStream As NetworkStream
    myStream = myClient.GetStream
    Console.WriteLine("Stream created")
    Dim ReceivedCommand As New Proto.TCP
    ReceivedCommand = ProtoBuf.Serializer.Deserialize(Of Proto.TCP)(myStream)
    Console.WriteLine("Stream deserialized")
    Dim Command As Integer
    Command = ReceivedCommand.Command
    Console.WriteLine(Command)
    Console.ReadLine()

这个代码卡在ReceivedCommand = ProtoBuf.Serializer.Deserialize(Of Proto.TCP)(myStream)

反序列化的格式是Deserialize(Of T)(source As System.IO.Stream),解释为"从协议缓冲流创建一个新实例"

我意识到有一种方法允许您使用长度前缀进行序列化和反序列化,适当地命名为"SerializeWithLengthPrefix"

我的一个担心是,将来我将不再编写服务器代码,我相信服务器代码将使用c++,它可能有也可能没有前缀长度的选项。

我意识到有一种方法允许您使用长度前缀进行序列化和反序列化,适当地命名为"SerializeWithLengthPrefix"

我的一个担忧是,将来我将不再编写服务器代码,我相信服务器代码将使用c++,它可能有也可能没有前缀长度的选项。

相关内容

  • 没有找到相关文章

最新更新