Jac*_*ack 7 .net c# tcp data-transfer
想象一下,你和我通过TCP发送了一个很长的句子(比方说,1024000字节).
如果你给我写了一个1024000字节的句子,你实际上使用NetworkStream写入这些字节.
当我收到时,我应该提前知道您发送的句子的大小吗?
如果没有,我如何检查何时应该停止stream.read?
如果是,该程序是否应具有将数据大小嵌入数据头部的工具?所以我先收到4个字节,看看我应该读多少个?
.Net有什么可以自动在传输中嵌入数据大小吗?
.NET 和 TCP 协议都没有内置任何内容来预先定义消息的大小。TCP 协议仅指定所有数据将被传输到接收端点(或者至少将尽最大努力这样做)。
您全权负责定义一种方法,让接收者知道要读取多少数据。正如其他人指出的那样,如何执行此操作的细节取决于您要传输的内容的性质:您可以像您提到的那样首先发送长度,您可以对称为终止符的特殊序列进行编码,您可以使用预定义的数据块所以所有消息都具有相同的大小,等等。
编辑
这最初是一条评论,但其中的内容超出了该限制。
将NULL 添加到流中只是意味着附加一个具有二进制值 0 的字符(不要与字符 混淆0)。根据您用于传输的编码(即 ASCII、UTF-8、UTF-16 等),可能会转换为发送一个或多个 0 字节,但如果您使用适当的转换,则只需输入\0类似你的字符串。这是一个例子:
string textToSend = "This is a NULL Terminated text\0";
byte[] bufferToSend = Encoding.UTF8Encoding.GetBytes(textToSend);
Run Code Online (Sandbox Code Playgroud)
当然,上述所有内容都假设您发送的所有其余数据不包含任何其他 NULL。这意味着它是文本,而不是任意二进制数据(例如文件的内容)。这非常重要!否则你不能使用 NULL 作为消息终止符,你必须想出另一个方案。
| 归档时间: |
|
| 查看次数: |
1100 次 |
| 最近记录: |