当您处理网络通信时,您必须定义一个“协议”来定义您的“消息”是什么,因为网络连接是基于 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)
如果有任何不清楚的地方,请在评论中说出来,我会详细说明。