private void send(msg m) { if (tc.Client == null || tc.Client.Connected == false) { exit(2); return; } try { var body = Secret.MD5(Serialize.ToJson(m) + key) + Serialize.ToJson(m); var data = Encoding.UTF8.GetBytes(body); Console.WriteLine("send->" + body + "(" + data.Length + "字节)"); Debug.WriteLine("send->" + body + "(" + data.Length + "字节)"); var dt = new List <byte>(); dt.AddRange(Encoding.UTF8.GetBytes("x.rbt")); dt.AddRange(BitConverter.GetBytes(data.Length)); dt.AddRange(Encry.Encode(data, key)); tc.Client.Send(dt.ToArray()); } catch (Exception ex) { Console.WriteLine("send->err." + ex.Message); Debug.WriteLine("send->err." + ex.Message); exit(1); } }
/// <summary> /// 解析消息 /// </summary> void Prase() { string str = ""; int hlen = 9; while (stop == 0) { if (data.Count < hlen) { Thread.Sleep(500); continue; } byte[] head = null; lock (data) head = data.Take(5).ToArray(); if (Encoding.UTF8.GetString(head) != "x.rbt") { lock (data) data.RemoveRange(0, hlen); continue; } var len = BitConverter.ToInt32(data.Skip(5).Take(4).ToArray(), 0) + 32; if (data.Count() < len) { continue; } byte[] msg = null; lock (data) msg = data.Skip(9).Take(len).ToArray(); lock (data) data.RemoveRange(0, len + 9); try { str = Encoding.UTF8.GetString(Encry.Decode(msg, key)); Console.WriteLine("parse->" + str); Debug.WriteLine("parse->" + str); var sign = str.Substring(0, 32); var json = str.Substring(32); if (sign != Secret.MD5(json + key)) { throw new Exception("签名验证失败"); } var m = Serialize.FromJson <msg>(json); switch (m.act) { case "heart": continue; case "exit": exit(1); break; case "msg": NewMsg?.Invoke(m.from, m.body, this); break; } } catch (Exception ex) { if (ex.Message == "Decode Error") { exit(2); } Console.WriteLine("parse->err." + ex.Message); Debug.WriteLine("parse->err." + ex.Message); } } }