コード例 #1
0
 public static void Register(BombplaneProto.Type type, CallBack method)
 {
     if (!_callBacks.ContainsKey(type))
     {
         _callBacks.Add(type, method);
     }
     else
     {
         Console.WriteLine("注册了相同的回调事件");
     }
 }
コード例 #2
0
        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);
        }
コード例 #3
0
        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++;
                }
            }
        }