protected void RegisterPacket(Proto.MsgId msgId, ProcessPacketDelegate callback)
        {
            if (!_msgHandler.ContainsKey(msgId))
            {
                _msgHandler.Add(msgId, null);
            }

            _msgHandler[msgId] = _msgHandler[msgId] + callback;
        }
        public bool SendPacket(Proto.MsgId msgId, Google.Protobuf.IMessage msg)
        {
            if (_state != NetworkState.Connected)
            {
                return(false);
            }

            int size = 0;

            if (msg != null)
            {
                size = msg.CalculateSize();
            }

            if (msgId != Proto.MsgId.MiPing)
            {
                UnityEngine.Debug.Log("send msg. msg_id:" + msgId + " msg size:" + size);
            }

            var          byteStream = new MemoryStream();
            BinaryWriter bw         = new BinaryWriter(byteStream);
            var          totalLen   = size + PacketHead.HeadSize;

            bw.Write((ushort)totalLen);     // total size
            bw.Write((ushort)2);            // head size
            bw.Write((ushort)msgId);

            if (msg != null)
            {
                Google.Protobuf.CodedOutputStream outStream = new Google.Protobuf.CodedOutputStream(byteStream);
                msg.WriteTo(outStream);
                outStream.Flush();
            }

            Byte[] buf = byteStream.ToArray();
            size = size + PacketHead.HeadSize;

            try
            {
                int pos = 0;
                while (size > 0)
                {
                    int sent = _sock.Send(buf, pos, size, SocketFlags.None);
                    size -= sent;
                    pos  += sent;
                }
            }
            catch (Exception ex)
            {
                UnityEngine.Debug.LogError(ex.Message);
                Disconnect();
                return(false);
            }

            return(true);
        }
        public void UnPacket(PacketHead head, byte[] byteArray, int offset, int length)
        {
            Proto.MsgId msgId = (Proto.MsgId)head.msg_id;
            if (!_msgHandler.ContainsKey(msgId))
            {
                UnityEngine.Debug.LogWarning("!!!!! not found handler. recv packet msgId:" + head.msg_id);
                return;
            }

            Google.Protobuf.IMessage msg = _msgHandler[msgId](byteArray, offset, length);
            MessagePackDispatcher.GetInstance().Broadcasting(head.msg_id, msg);
        }