public static void Register(BombplaneProto.Type type, CallBack method) { if (!_callBacks.ContainsKey(type)) { _callBacks.Add(type, method); } else { Console.WriteLine("注册了相同的回调事件"); } }
private static byte[] _Pack(BombplaneProto.Type type, byte[] data = null) { MessagePacker packer = new MessagePacker(); if (data != null) { packer.Add((ushort)(4 + data.Length)); //消息长度 packer.Add((ushort)type); //消息类型 packer.Add(data); //消息内容 } else { packer.Add(4); //消息长度 packer.Add((ushort)type); //消息类型 } return(packer.Package); }
public static void _Receive() { Console.WriteLine("消息接收线程已经开启..."); // 持续接受消息 while (true) { byte[] data = new byte[2048]; Package package = new Package(); BombplaneProto.Type type = BombplaneProto.Type.Unknown; // 接收消息长度 int receive = 0; try { receive = _client_socket.Receive(data); } catch (Exception e) { Console.WriteLine("接收消息错误: " + e.ToString()); continue; } // 解析消息过程 try { package.head.len = IPAddress.NetworkToHostOrder(BitConverter.ToInt16(data, 0)); package.head.seq = IPAddress.NetworkToHostOrder(BitConverter.ToInt16(data, 2)); } catch (Exception e) { Console.WriteLine("解析消息错误: " + e.ToString()); continue; } Console.WriteLine("收到的消息长度为" + package.head.len.ToString()); Console.WriteLine("收到的消息序列号为" + package.head.seq.ToString()); Console.WriteLine("此时期待的消息序列号为" + safe_seqs[seq_num.rseq]); if (package.head.len == 4) { Console.WriteLine("收到一个ACK包,序号为" + package.head.seq.ToString()); if (package.head.seq == safe_seqs[seq_num.sack]) { safe_seqs[seq_num.sack]++; } continue; } if (package.head.len == 11 && package.head.seq == 0) { SendAck(package.head.seq); safe_seqs[seq_num.rseq]++; continue; } if (package.head.seq == safe_seqs[seq_num.rseq]) { if (package.head.len > 4) { SendAck(package.head.seq); safe_seqs[seq_num.rseq]++; } } else if (package.head.seq < safe_seqs[seq_num.rseq]) { if (package.head.len > 4) { SendAck(package.head.seq); } continue; } if (package.head.len > 4) { //Console.WriteLine("收到一个数据包!"); byte[] content = new byte[package.head.len - 4]; Array.Copy(data, 4, content, 0, package.head.len - 4); package.content = content; //content.CopyTo(package.content, 0); Message message = PackageUtils.PackageToMessage(package); Console.WriteLine("接收到消息,类型为" + message.Type.ToString() + ",序号为" + package.head.seq.ToString()); type = message.Type; // 执行回调事件 if (_callBacks.ContainsKey(type)) { CallBack callBack = new CallBack(message, _callBacks[type]); // 放入回调执行线程 _callBackQueue.Enqueue(callBack); } } // 收到的包是ack包 else { Console.WriteLine("收到一个ACK包,序号为" + package.head.seq.ToString()); if (package.head.seq == safe_seqs[seq_num.sack]) { safe_seqs[seq_num.sack]++; } //receive_seq++; } } }