Exemple #1
0
        void HandleDataEvent(int channelId, byte[] buffer, int length)
        {
            var lastIndex = length - 1;

            m_NetworkReader.SeekZero();

            MessageHandlerDelegate handler;

            while (m_NetworkReader.Position < lastIndex)
            {
                m_NetworkReader.Lock(HEADER_BYTE_COUNT);

                // the reader passed to user code has a copy of bytes from the real stream. user code never touches the real stream.
                // this ensures it can never get out of sync if user code reads less or more than the real amount.
                ushort msgSize = m_NetworkReader.ReadUInt16();
                ushort msgType = m_NetworkReader.ReadUInt16();

#if NETWORK_DEBUGGER_ENABLED
                UnityEngine.Debug.Log($"{DEBUGGING_NAME} Incoming : MsgType:{msgType}, ChannelId:{channelId} Size:{msgSize}");
#endif

#if NETWORK_PROFILER_ENABLED && UNITY_EDITOR
                var profilerName = new StringBuilder(DEBUGGING_NAME);
                profilerName.Append(msgType);
                NetworkProfiler.RecordMessageIncoming(profilerName.ToString(), msgSize);
#endif

                m_NetworkReader.Lock((ushort)(msgSize - HEADER_BYTE_COUNT));

                if (m_Handlers.TryGetValue(msgType, out handler))
                {
                    handler.Invoke(m_ClientPeer.Connection, m_NetworkReader);
                }
                else
                {
                    UnityEngine.Debug.LogWarning($"Unknown message ID {msgType} from channel:{channelId}");
                }

                m_NetworkReader.CheckReading();
            }
        }