【发布时间】:2020-04-27 11:15:36
【问题描述】:
我在几个地方看到人们说TcpClient 和NetworkStream 比原始Socket 更受欢迎,例如,它们有助于“数据框架”,从而可以从服务器接收到的消息需要解析并拼凑到原始消息中的任意数量的片段(不保证 1:1 调用发送/接收)
我不明白的是如何在这方面更好?它肯定不能神奇地将消息拼凑在一起,因为该信息不是通过 TCP 传输的。它不能期望发送关于消息长度的额外数据,否则它将与大多数 TCP 服务器不兼容,只有那些使用 TcpListener 的服务器。
从NetworkStream 读取数据似乎与从Socket 接收数据非常相似,所以有人能解释一下它如何让我作为 TCP 编码新手的生活更轻松吗?
【问题讨论】:
-
It surely cannot magically piece messages back together since that information isn't transmitted over TCP你确定吗? -
是的。 TCP 是字节流,而不是像 UDP 这样的数据报。在单个
send()调用中发送 N 个字节不会导致在另一端的单个recv()调用中返回相同的确切缓冲区。它可能,但不能保证。设备可能会将其分成更小的块或将其与前一个或下一个块混在一起。它可能会受到 MTA 设置的影响,因为它通过各种网络进行路由。边界标记不是 TCP 协议的一部分,因此应用程序必须根据内容确定这些边界的位置。TcpClient没有应用协议的概念。 -
那么,它有什么帮助呢?我可以看到
NetworkStream.DataAvailable属性,但还有什么? -
我最好的猜测是 1)它将套接字(及其状态)的概念与其数据流分开,2)它提供了一个以客户端为中心的 API(
Socket既不知道也不关心它是哪一端),以及 3)它的 Async API 与async/await兼容,而Socket仍然使用IAsyncResult和Begin/End方法。