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

Tcp 使用protobuf net反序列化协议缓冲区时,如何指定流长度?,tcp,stream,protocol-buffers,protobuf-net,Tcp,Stream,Protocol Buffers,Protobuf Net,我尝试使用协议缓冲区通过TCP连接将整数从服务器发送到客户端。我相信我的服务器正在向流中写入内容,但是当客户端试图从网络流中反序列化时,我的代码会无限期地暂停。我的直觉告诉我,客户端不知道流的长度,因此不知道读取何时完成,但反序列化方法没有长度输入,因此我不确定如何实现。下面是我的原型定义、服务器和客户端的代码 原型定义 Public Class Proto <ProtoContract()> Public Class TCP <ProtoMember(1)>

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

原型定义

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

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

客户端代码

    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(Proto.TCP)(myStream)

反序列化的格式是反序列化(Of T)(源代码为System.IO.Stream),解释为“从协议缓冲流创建新实例”


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


我的一个担心是,将来我不会编写服务器代码,我相信服务器代码将是C++的,它可能有或可能没有选择一个前缀长度。

< P>我意识到有一种方法允许你用长度前缀序列化和反序列化,适当地命名为“SerialZeIn LosithPrimeX”< /P>
我的一个担心是,将来我不会编写服务器代码,我相信服务器代码将在C++中,它可能有或可能没有选择一个前缀长度。p> 我意识到有一种方法允许您使用长度前缀进行序列化和反序列化,该前缀被恰当地命名为“SerializeWithLengthPrefix”

我的一个担心是,将来我不会编写服务器代码,我相信服务器代码将在C++中,它可能有或可能没有选择一个前缀长度。p>
    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()