Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
menu search
person
Welcome To Ask or Share your Answers For Others

Categories

以前一直做PHP,只处理HTTP超文本数据,后来转底层开发语言,对于TCP数据的传输不太理解,比如iOS客户端发送了数据包,到了Go的服务端,却可以解出数据类型来判断使用哪种方法进行处理,这里面是如何实现的?

传输给Go服务的数据是Payload字节码,没有文本内容定义,但最后却可以解出结构类名。

switch msg.(type) {
case *mtproto.RawMessageData:
    rawMsg, _ := msg.(*mtproto.RawMessageData)
default:
    err = fmt.Errorf("invalid msg, msg: %#v", msg)
}

iOS传递来的数据是这样的

Payload:[8 213 170 149 157 249 255 255 255 255 1 18 12 24 9 40 161 138 220 222 223 252 255 207 77] Attachment:[33 5 215 251 229 255 159 77 201 104 109 152 83 157 46 255 16 95 208 199 116 229 234 133 241 60 194 6 190 182 153 206 65 228 89 231 82 207 219 56 135 30 105 51 138 193 122 183 235 227 16 58 100 240 243 185 201 124 148 123 38 125 142 35 57 69 208 250 79 191 148 169 122 104 185 123 151 24 116 235 118 4 174 159 50 110 106 131 215 162 173 44 123 174 91 184 1 233 114 168 167 1 182 182 217 28 235 220 149 144 131 164 54 79 67 77 145 220 193 73 243 105 215 119 76 106 190 142 254 50 11 139 186 238 61 182 255 132 228 163 134 227 177 165 7 159 206 110 14 212 0 177 117 233 161 245 252 62 161 119 149 43 130 199 148 137 183 143]} payload=[8 213 170 149 157 249 255 255 255 255 1 18 12 24 9 40 161 138 220 222 223 252 255 207 77]

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
535 views
Welcome To Ask or Share your Answers For Others

1 Answer

就是按字节处理啊,哪怕你 HTTP 文本协议不也是字节?

字符 a 对应 UTF-8 字节就是 97,你以为你比较的是 'a' === 'a',在机器看来就是 97 === 97

另外你这个问题跟 TCP 无关,完全就是序列化和反序列化的问题。最流行的基于文本的序列化方案就是 JSON;你这个是基于字节流的序列化方案了,具体咋实现的啥,看代码啊,谁知道你用的啥?

  • 序列化:我内存里有一个对象,咋变成一串字节流(前面说了哪怕文本它也是字节流的一种),好传输给别人;
  • 反序列化:我有一串字节流,咋变成一个内存里的对象。

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
...