0

我正在学习http://www.daveoncsharp.com/2009/08/csharp-chat-application-over-asynchronous-udp-sockets-part-1教程中的一个聊天应用程序。但是我有一个问题,任何人都可以为我解释在“数据包类”中,为什么我们知道“数据标识符”的“字节大小”是 4,“名称长度”是 4,我在数据包类的顶部看到了描述但是我不知道为什么。还有这些:

this.dataIdentifier = (DataIdentifier)BitConverter.ToInt32(dataStream, 0); // 我们将从 dataStream 的索引 0 转换,但它怎么知道结束 ???

int nameLength = BitConverter.ToInt32(dataStream, 4); // 为什么我们知道它是从 4 开始的?

非常感谢你,对不起我的英语。

4

1 回答 1

0

当您处理网络通信时,您必须定义一个“协议”来定义您的“消息”是什么,因为网络连接是基于 Stream 而不是基于 Message

所以在协议中定义如下

描述 -> |数据标识符|名称长度|消息长度| 姓名 | 留言 |
以字节为单位的大小 -> | 4 | 4 | 4 |名称长度|消息长度|

Aint将始终是 aSystem.Int32并且 aSystem.Int32将始终需要 4 个字节来存储(将 32 除以 8 得到 4)。

这是另一行显示每列的数据类型,也许这会对您有所帮助

描述 -> |数据标识符|名称长度|消息长度| 姓名 | 留言 |
以字节为单位的大小 -> | 4 | 4 | 4 |名称长度|消息长度|
数据类型 -> | 整数 | 整数 | 整数 | 字符串 | 字符串 |

那么,现在我们为什么要在位转换器中跳过 4 个字节。

让我们将架构备份,但这次我将向下数字表示字节数

现在最后两个是“特殊的”,它们的长度不像前 3 个那样是固定长度,它们所做的是从前一列中获取值,即读取了多少字节。

描述 -> |数据标识符|名称长度|消息长度| 姓名 | 留言 |
以字节为单位的大小 -> | 4 | 4 | 4 | 姓名长度 | 消息长度 |
字节 -> |0 1 2 3 | 4 5 6 7 | 8 9 10 11 | 12 到(12 + 名称长度)| (12 + 名称长度) + 1 到 ((12 + 名称长度) + 1 + 消息长度) |

所以你可以看到dataIdentifier我们从索引 0 开始读取 4 个字节(这是BitConverter.ToInt32要读取的字节数)。然后,当我们要读取时,nameLength我们需要从索引 4 开始,然后再读取 4 个字节,这就是为什么BitConverter.ToInt32传递 4(并且messageLength将传递 8)

如果有任何不清楚的地方,请在评论中说出来,我会详细说明。

于 2013-09-16T17:05:42.177 回答