我正在http://www.daveoncsharp.com/2009/08/csharp-chat-application-over-asynchronous-udp-sockets-part-1的教程中学习一个聊天应用程序。但我有一个问题,任何人都可以解释一下,在“数据包类”中,为什么我们知道“dataIdentifier”的“大小以字节为单位”是4,“名称长度”是4,我看到了数据包类顶部的描述但是我不知道为什么。而这些:
this.dataIdentifier =(DataIdentifier)BitConverter.ToInt32(dataStream,0); //我们将从dataStream的索引0转换,但它如何知道结束???
int nameLength = BitConverter.ToInt32(dataStream,4); //为什么我们知道它从4开始?
非常感谢,对不起我的英语。
答案 0 :(得分:0)
当您处理网络通信时,您必须定义“协议”以定义“消息”的内容,因为网络连接是Stream based not Message based。
因此在protocal中定义如下
Description -> |dataIdentifier|name length|message length| name | message | Size in bytes -> | 4 | 4 | 4 |name length|message length|
int
始终为System.Int32
,System.Int32
始终需要4个字节进行存储(将32除以8得到4)。
这是另一行显示每列的数据类型,可能会对您有所帮助
Description -> |dataIdentifier|name length|message length| name | message | Size in bytes -> | 4 | 4 | 4 |name length|message length| Data Type -> | int | int | int | string | string |
那么,为什么我们为什么要在位转换器中跳过4个字节。
让我们重新设置架构,但这次我会,但数字下降表示字节数
现在最后两个是“特殊的”,它们的长度不是像前3个那样的固定长度,它们所做的是从前一列获取值,即读入的字节数。
Description -> |dataIdentifier|name length|message length| name | message | Size in bytes -> | 4 | 4 | 4 | name length | message length | Bytes -> |0 1 2 3 | 4 5 6 7 | 8 9 10 11 | 12 through (12 + name length) | (12 + name length) + 1 through ((12 + name length) + 1 + message length) |
所以你可以看到读dataIdentifier
我们从索引0开始读取4个字节(这将是多少BitConverter.ToInt32
将读取)。然后,当我们想要读取nameLength
时,我们需要从索引4开始,然后读取另外4个字节,这就是为什么BitConverter.ToInt32
被传递4(并且messageLength
将被传递8)
如果有任何不清楚的地方,请在评论中说明,我会详细说明。