C#在同一个Socket上发送多个对象
发布时间:2020-12-16 01:43:07 所属栏目:百科 来源:网络整理
导读:我正在尝试从一个套接字向另一个套接字发送多个不同的对象(好吧,它们是相同的对象类型,只是具有不同的值).我可以使用以下代码发送一个对象: 客户: var buffer = new byte[1024];var binFormatter = new BinaryFormatter();using (var ms = new MemoryStrea
我正在尝试从一个套接字向另一个套接字发送多个不同的对象(好吧,它们是相同的对象类型,只是具有不同的值).我可以使用以下代码发送一个对象:
客户: var buffer = new byte[1024]; var binFormatter = new BinaryFormatter(); using (var ms = new MemoryStream()) { int bytesRead; while ((bytesRead = _clientReceive.Receive(buffer)) > 0); { ms.Write(buffer,bytesRead); } ms.Position = 0; message = (Message)binFormatter.Deserialize(ms); } 服务器: var gm = new Message { Message = "ObjectType",Object = Data }; using (var mem = new MemoryStream()) { var binFormatter = new BinaryFormatter(); binFormatter.Serialize(mem,gm); var gmData = mem.ToArray(); client.Send(gmData,gmData.Length,SocketFlags.None); client.Close(); } 但是如果我想发送多条消息(将完整的客户端代码放在循环中而不是调用client.Close()),我怎样才能确定客户端何时收到完整的对象?将客户端代码放在这样的循环中: while (_isReceivingStarted) { var buffer = new byte[1024]; var binFormatter = new BinaryFormatter(); using (var ms = new MemoryStream()) { int bytesRead; while ((bytesRead = _clientReceive.Receive(buffer)) > 0) { ms.Write(buffer,bytesRead); } ms.Position = 0; message = (Message) binFormatter.Deserialize(ms); } // Do stuff then wait for new message } 客户端将挂起_clientReceive.Receive(缓冲区),因为它没有从客户端收到Close()并且永远不会获得0个接收的字节.如果我关闭服务器上的连接,它将循环,然后在Deserialize MemoryStream中出错,而不是在the_clientReceive.Receive(缓冲区)阻塞,以预期发送另一个对象. 我希望这是有道理的.有什么指针吗? 解决方法
您可以发送一条头消息,通知接收端需要多少字节.这类似于HTTP中的Content-Length指令.其他选项,制作一个你最后发送的自定义终止字符串(显然它不会在序列化对象的二进制有效负载中的任何位置出现,这就是为什么前一个解决方案就是我要做的).
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |