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