C#里面如何实现socket 接受信息并分辨接受的数据类型 在搜索到的例子当中,都将接受信息当作string 处理,如果是自定义数据呢,应该如何分辨出接受到的信息的数据类型,并从字节流数组中取出来使用呢. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 其实你接到的都是byte[],看你过往的提问有C++的底子,我们换用C++来说C++有结构体,C#当然有结构体。C++的人做这种解析一般就是byte[]转成结构体C#当然也能这么干。ps:当然现在为了简单,大多数情况如果双方能沟通,一般都协定采用json,mqtt这种标准来搞,很少自己玩结构体转字节,字节转结构体了,如果实在是特殊需要自己定义一般也借助Protocolbuf或者avro去统一协定 消息通讯要自己封装一层概念,不能只知道拿最底层的概念来说。比如说要使用 json 格式来传送一个自定义对象,例如{ T1: "张三的头像", Img1Base64: "........"}那么消息最终传送时就可能会封装为{ sendMessageType: "ABC.设置头像, ABC", index: 123; data: { T1: "张三的头像", Img1Base64: "........" }} 的形式,也就是说为消息增加一个命令说明。 你可以定义一个 json 基本的封装{ sendMessageType: 命令类型全称; index: 消息编号; data: 消息对象本身}或者根据自己的需求进行任意扩展。总之是要自己根据需要来设计一层上层建筑。必要只会底层照抄。 因为这些数据实际上都是二进制数据流,所以单纯看是无法知道数据类型的,常用都是转为string,所以一般就在string中标明该数据是什么,就像楼上说的 必要只会底层照抄 --> 不要只会底层照抄如果有了一些基本的理念,上了适当的层,才好讨论一些稍微做大项目的实际的设计概念。例如当你开发运维大系统的时候,比如说有2万客户端程序部署着,那么当你更新系统版本的时候(此时系统中某个信令的设计版本修改了、扩充了),你并不能保证2万客户端全都同时更新到最新版本了。那么有些客户端用旧版本的 model 来解析,有的客户端用新版本的 model 定义来解析,即使传来的 json 格式不完全充分,你也能正确反序列化;即使传来的 json 格式比需要的多一些字段,或者次序根本不一样,也不影响反序列化。这就是实际需求。 另外,当数据落地的时候,也会有不同版本。例如有的数据有 T1、Img1Base64 两个字段,而新的数据则还有 T2、Img2Base64 增加的两个字段。那么把旧的数据读取出来、传输出去、反序列化,也是必须的。所以设计程序时要跟上潮流,要适应现在的灵活的需求。 C#的socket也有接收的,也有byte[],你看到的例子不知道是什么样,byte[]必须要的,具体说要怎么区分什么数据类型,那得看服务器的文档说明呀,那都有规则的,比如有些前四个表示长度int,那就是4个字节int,那就取前面4个byte然后转成int类型,就能得到长度int,C#把byte[]转int你可以百度下,有的 https://download.csdn.net/download/gs0038/2548575 这个是给你做一个基础学习参考,希望你从简单的入手 https://download.csdn.net/download/gs0038/10129815这是一个高级的,当你学会基础了,再下载这个学习高级的,一步一步就会了 就是我有一种想法,本身得到的是byte[] ,得到了这个字节串之后,在字节串的前面加上一个用来判断类型的东西,比如说 最后是这样(byte[]代表字节数组) “1:byte[]”,“2:byte[]”自己约定,1开头表述一种类型(文字类型),2开头表示另一种类型(图片类型)。。以此,不知道可否实现。 就是说,byte[0]约定好用来代表某个类型,数据都放在byte[0]之后的数组之中,从byte[1]开始放数据 当然可以,最古老的计算机通信协议ASN.1/BER就是你想的东西,当然这种玩意因为太过麻烦,所以现在使用简单的json,mqtt,xml这类而我上面提的Protocolbuf或者avro是另外一种方向,他不是让你去写解析过程,这种是先用类似ASN建立一个描述文件,然后利用他给的工具把你的描述文件翻译成object,同时提供给你标准的序列/反序列过程,不用你自己去分析解析 当然可以,最古老的计算机通信协议ASN.1/BER就是你想的东西,当然这种玩意因为太过麻烦,所以现在使用简单的json,mqtt,xml这类而我上面提的Protocolbuf或者avro是另外一种方向,他不是让你去写解析过程,这种是先用类似ASN建立一个描述文件,然后利用他给的工具把你的描述文件翻译成object,同时提供给你标准的序列/反序列过程,不用你自己去分析解析嗯,,,我也觉得麻烦,感谢大佬的分析与讲解 随便在git上找了一个ber解析的东西https://github.com/Asn1Net/Asn1Net.Reader顺手挑了里面一段代码,你看看这种比较古老的协议规定长啥样 const string example = @" 06 09 ; OBJECT_ID (9 Bytes) --06是oid类型这个类型比较特殊,你可以不用管,09是这个内容长9字节 | 2b 06 01 04 01 82 37 15 14 ; 1.3.6.1.4.1.311.21.20 31 4a ; SET (4a Bytes) 30 48 ; SEQUENCE (48 Bytes) 02 01 ; INTEGER (1 Bytes) | 09 0c 23 ; UTF8_STRING (23 Bytes) -----0c这个是utf8的string,内容长23字节 | 76 69 63 68 33 64 2e 6a ; vich3d.j | 64 6f 6d 63 73 63 2e 6e ; domcsc.n | 74 74 65 73 74 2e 6d 69 ; ttest.mi | 63 72 6f 73 6f 66 74 2e ; crosoft. | 63 6f 6d ; com 0c 15 ; UTF8_STRING (15 Bytes)-----另一个utf8的string,长15字节 | 4a 44 4f 4d 43 53 43 5c ; JDOMCSC\ | 61 64 6d 69 6e 69 73 74 ; administ | 72 61 74 6f 72 ; rator 0c 07 ; UTF8_STRING (7 Bytes) 63 65 72 74 72 65 71 ; certreq ";话说这里面还有很多道道,BER还是比较复杂的协议规定,所以个人已经不推荐,如果是异构开发,不如采用json或者Protocolbuf这类简单方便的东西 直接用 三方写好的 就行。比如 thrift,zmq 这些 不用担心 什么类型。 c#中string型和c++string型的区别 treeview展开后,怎么隐藏节点的图片? jquery怎么判断tr里是否有checkbox 剪切或者替换字符串 C#挑战性的题目 问个问题(多线同步),因为奥运会要开幕了,进来的都交好运!! [求助]取出字符串中的数字问题? 简单的SQL语句不会写,请教!!! C#中如何将一个类用XML序列化后,作为一个节点添加到已存在的xml文件中 office怎么在线可以预览使用C#语言 c# new bitmap报参数无效 在vs中使用axWindowsMediaPlayer一直处于读取状态
C++的人做这种解析一般就是byte[]转成结构体
C#当然也能这么干。ps:当然现在为了简单,大多数情况如果双方能沟通,一般都协定采用json,mqtt这种标准来搞,很少自己玩结构体转字节,字节转结构体了,如果实在是特殊需要自己定义一般也借助Protocolbuf或者avro去统一协定
T1: "张三的头像",
Img1Base64: "........"}那么消息最终传送时就可能会封装为{
sendMessageType: "ABC.设置头像, ABC",
index: 123;
data: {
T1: "张三的头像",
Img1Base64: "........"
}
} 的形式,也就是说为消息增加一个命令说明。
sendMessageType: 命令类型全称;
index: 消息编号;
data: 消息对象本身
}
或者根据自己的需求进行任意扩展。总之是要自己根据需要来设计一层上层建筑。必要只会底层照抄。
常用都是转为string,所以一般就在string中标明该数据是什么,就像楼上说的
如果有了一些基本的理念,上了适当的层,才好讨论一些稍微做大项目的实际的设计概念。例如当你开发运维大系统的时候,比如说有2万客户端程序部署着,那么当你更新系统版本的时候(此时系统中某个信令的设计版本修改了、扩充了),你并不能保证2万客户端全都同时更新到最新版本了。那么有些客户端用旧版本的 model 来解析,有的客户端用新版本的 model 定义来解析,即使传来的 json 格式不完全充分,你也能正确反序列化;即使传来的 json 格式比需要的多一些字段,或者次序根本不一样,也不影响反序列化。这就是实际需求。
这个是给你做一个基础学习参考,希望你从简单的入手
这是一个高级的,当你学会基础了,再下载这个学习高级的,一步一步就会了
当然可以,最古老的计算机通信协议ASN.1/BER就是你想的东西,当然这种玩意因为太过麻烦,所以现在使用简单的json,mqtt,xml这类而我上面提的Protocolbuf或者avro是另外一种方向,他不是让你去写解析过程,这种是先用类似ASN建立一个描述文件,然后利用他给的工具把你的描述文件翻译成object,同时提供给你标准的序列/反序列过程,不用你自己去分析解析
当然可以,最古老的计算机通信协议ASN.1/BER就是你想的东西,当然这种玩意因为太过麻烦,所以现在使用简单的json,mqtt,xml这类而我上面提的Protocolbuf或者avro是另外一种方向,他不是让你去写解析过程,这种是先用类似ASN建立一个描述文件,然后利用他给的工具把你的描述文件翻译成object,同时提供给你标准的序列/反序列过程,不用你自己去分析解析嗯,,,我也觉得麻烦,感谢大佬的分析与讲解
https://github.com/Asn1Net/Asn1Net.Reader顺手挑了里面一段代码,你看看这种比较古老的协议规定长啥样 const string example = @"
06 09 ; OBJECT_ID (9 Bytes) --06是oid类型这个类型比较特殊,你可以不用管,09是这个内容长9字节
| 2b 06 01 04 01 82 37 15 14 ; 1.3.6.1.4.1.311.21.20
31 4a ; SET (4a Bytes)
30 48 ; SEQUENCE (48 Bytes)
02 01 ; INTEGER (1 Bytes)
| 09
0c 23 ; UTF8_STRING (23 Bytes) -----0c这个是utf8的string,内容长23字节
| 76 69 63 68 33 64 2e 6a ; vich3d.j
| 64 6f 6d 63 73 63 2e 6e ; domcsc.n
| 74 74 65 73 74 2e 6d 69 ; ttest.mi
| 63 72 6f 73 6f 66 74 2e ; crosoft.
| 63 6f 6d ; com
0c 15 ; UTF8_STRING (15 Bytes)-----另一个utf8的string,长15字节
| 4a 44 4f 4d 43 53 43 5c ; JDOMCSC\
| 61 64 6d 69 6e 69 73 74 ; administ
| 72 61 74 6f 72 ; rator
0c 07 ; UTF8_STRING (7 Bytes)
63 65 72 74 72 65 71 ; certreq
";
话说这里面还有很多道道,BER还是比较复杂的协议规定,所以个人已经不推荐,如果是异构开发,不如采用json或者Protocolbuf这类简单方便的东西