【问题标题】:check if byte array is fully sent through TCP connection c#检查字节数组是否通过TCP连接完全发送c#
【发布时间】:2021-03-22 18:00:00
【问题描述】:

我有一个位图,我使用 BinaryFormatterMemoryStream 将其转换为字节,然后将字节发送到 TCP 服务器,当我尝试将其转换回 BitMap我收到此错误 System.Runtime.Serialization.SerializationException: End of Stream encountered before parsing was completed. 我试过了将位图转换为字节,然后在客户端将字节转换为位图只是为了检查错误是否是由于转换引起的,但一切正常。所以我认为问题是服务器正在接收数组字节而不是1个大数组,所以我的问题是如何检查字节数组是否已完全发送?

【问题讨论】:

  • 确保发送的字节数等于接收的字节数。您应该在 TCP 消息的开头发送一个字节数,然后在接收端读取,直到达到字节数。此外,显卡可能不支持图像类型。所以测试并确保你可以在接收端打开图像。

标签: c# tcp


【解决方案1】:

正如您所说,数据绝对可以以多个块的形式发送,您需要知道何时收到所有数据。对于 HTTP,您在标头中使用 Content-Length 来让客户端知道何时收到所有数据。由于您控制双方,您可以将图像转换为字节数组,检查大小并假设它的 5000 字节。 然后你创建一个 int (或 long 如果需要,在这种情况下可能不是)并将其设置为 5000 并首先发送(作为字节)然后发送其余数据。然后,您将创建自己的标题。另一方面,您首先读取 int 的确切字节数(或其他,如果您选择 long 等)。然后将字节转换为 int,您知道它现在将变为 5000 个字节。然后开始阅读,直到你有 5000 个字节。这总是可以优化的,但这是一种简单的方法。

【讨论】:

  • 我可以使用它,谢谢,还有 1 件事,如果接收到的数据未知怎么办,但我知道只有 1 个要发送的数据包,我如何检查字节是否数组发送完毕?
  • 不确定您所说的未知是什么意思?问题是,当您发送某些内容时,它会“缓存”在您的计算机上,并以块的形式发送给同样以块的形式接收的另一方。无论您如何发送数据包,都无法知道数据包实际上是如何发送的。当所有内容都在您的代码中发送时,它会传递给操作系统,如果它正忙于做其他网络事情,它可以直接或稍后(以毫秒为单位)以块的形式发送它......(有点简化)。
猜你喜欢
  • 1970-01-01
  • 2011-02-22
  • 1970-01-01
  • 1970-01-01
  • 2015-04-16
  • 1970-01-01
  • 1970-01-01
  • 2012-03-06
  • 2018-12-20
相关资源
最近更新 更多