在 UWP 应用程序中通过流重构通过网络发送的数据

Posted

技术标签:

【中文标题】在 UWP 应用程序中通过流重构通过网络发送的数据【英文标题】:Reconstructing data sent over the network in UWP apps via streams 【发布时间】:2016-06-03 19:30:33 【问题描述】:

我正在尝试使用 UWP 中的流来通过网络将数据从一台机器发送到另一台机器。

在发送机器上,我创建了一个 DatagramSocket 并将我要发送的数据序列化为字节并将其写入输出流。

在接收机器上,我创建另一个 DatagramSocket 并处理 MessageReceived 事件以收集发送的数据。

这似乎是有效的,当我从一台机器发送数据时,我确实在另一台机器上接收它。

但是,我在发送方上序列化的数据大小为 8150 字节,我将其写入流中。

在接收端,我只收到大约 13 个字节的数据,而不是我预期的全部负载...

所以看来我负责在接收端通过等待所有数据通过可能是多个流的方式来重建完整的数据对象......

但是,我收到的数据包似乎是 1:1 - 也就是说,如果我在发送之前和接收之后设置了一个断点,那么当我将数据写入并刷新到输出流并发送时它,接收端然后触发,我得到似乎是部分数据,但我从来没有得到任何其他数据。

所以当我从发送机器发送 8150 个字节时,接收端只收到一个长度约为 13 个字节的数据包......

我会丢失数据包吗?它似乎是一个一致的 13 字节,所以也许它是一个缓冲区设置,但问题是我的 8150 字节是任意的;有时它更大或更小......

我显然做错了,但我对网络编程太陌生了,我不确定从哪里开始解决这个问题;在高层次上,将完整的内存对象从一台机器发送到另一台机器以便我可以在接收端重建它的精确副本的正确方法是什么?

【问题讨论】:

【参考方案1】:

好吧,事实证明问题在于,当我在发送方机器上写入输出流时,我使用的是常规 StreamWriter 并将数组作为对象发送:

        using (StreamWriter writer = new StreamWriter(stream))
        
            writer.Write(output);
            writer.Flush();
        

我相信这最终会使用 ToString() 写入对象本身,所以我实际写入流的是“byte[]”或任何类型......

我将其替换为 BinaryWriter 并写入完整的输出数组,现在另一端接收到完整的内容!

        using (BinaryWriter writer = new BinaryWriter(stream))
        
            writer.Write(output);
            writer.Flush();
        

我知道这不是很好的组合,但我几乎不知道我在这里做什么 :) 我仍然希望这可能对其他人有所帮助。

【讨论】:

以上是关于在 UWP 应用程序中通过流重构通过网络发送的数据的主要内容,如果未能解决你的问题,请参考以下文章

在java 8中通过流从1个列表的1个列表中获取所有对象?

UWP中通过x:bind将数据绑定到ListView

如何在 Python 中通过 HTTP 提供来自 UDP 流的数据?

win 10 UAP/UWP(通用应用程序)的异步套接字库?

NotificationHub 在注册标签 UWP 中发送通知

如何在 UWP 上使用 Xamarin.Forms 在平板电脑之间通过 WiFiDirect 发送视频