我正在尝试使用协议缓冲区通过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++,它可能有也可能没有前缀长度的选项。