像TCP一样流式传输UDP

本文关键字:传输 UDP 一样 TCP | 更新日期: 2023-09-27 18:29:21

是否可以像在TCP中那样使用NetworkStream,但在UDP中?

我知道UDP不允许检查之类的。

但我想知道是否有可能拥有它,这样你就可以在流中写入(而不是手动将字节数组划分为适合包的大小)。

我只是想知道这一点,因为这将是一个很好的测试和实验。

像TCP一样流式传输UDP

我通常这样做:

var writer = new StringWriter();
writer.WriteLine("Stuff!");
writer.WriteLine("Things!");
...
var bytes = new ASCIIEncoding().GetBytes(writer.GetStringBuilder().ToString());
_udpClient.Send(bytes, bytes.Length, _host, _port);

在阅读方面,你可以这样做:

var bytes = _udpClient.Receive(ref remoteEP);
var packetString = new ASCIIEncoding().GetString(bytes);
var reader = new StringReader(packetString);
reader.ReadLine();  // Stuff!
reader.ReadLine();  // Things!

不完全是流式传输(如果你有很多内容,内存中的字节数组可能会很糟糕),但这对我的小数据包很有效。

请注意,在我的应用程序中,如果数据包丢失或到达不正常,这是完全可以的。这对你的应用程序也必须如此,否则UDP不适合你。事实上,你认为你的内容是"流媒体",这表明你需要以相同的顺序接收你发送的所有内容。

问题是UPD不可靠,因此可能会丢失一些数据。您可以将UDP作为流处理,只能由块发送。