Beispiel #1
0
        protected bool HandleMessage(Message message)
        {
            lock (Sync) switch (message.Opcode)
                {
                case 1: OnString?.Invoke(Encoding.UTF8.GetString(message.Payload)); return(true);

                case 2: OnBinary?.Invoke(message.Payload); return(true);

                case 8:
                    if (message.Length < 2)
                    {
                        FinishClose(); return(true);
                    }
                    ushort code   = (ushort)(message.Payload[0] * 256 + message.Payload[1]);
                    string reason = Encoding.UTF8.GetString(PrimitiveBuffer.Slice(message.Payload, 2, message.Length));
                    if (RecvClose && message.Length > 2)
                    {
                        return(false);
                    }
                    if (message.Length > 2)
                    {
                        return(FinishClose(code, reason));
                    }
                    return(FinishClose(code));

                case 9: OnPing?.Invoke(message.Payload); return(true);

                case 10: OnPong?.Invoke(message.Payload); return(true);

                default: return(false);
                }
        }
Beispiel #2
0
        private void OnIncomingMessage(Message message)
        {
            if (State == TcpSocketState.Closed)
            {
                return;
            }
            switch (message.Opcode)
            {
            case 1:
                string str;
                try { str = Encoding.UTF8.GetString(message.Data); }
                catch (ArgumentException) { ForciblyClose(); return; }
                OnString?.Invoke(str);
                break;

            case 2: OnBinary?.Invoke(message.Data); break;

            case 8:
                ushort code   = (ushort)(message.Data.Length == 0 ? 0 : message.Data[0] * 256u + message.Data[1]);
                string reason = message.Data.Length >= 2 ? Encoding.UTF8.GetString(message.Data, 2, message.Data.Length - 2) : null;
                OnClose?.Invoke(code, reason);
                AnswerClose(code, reason);
                break;

            case 9: OnPing?.Invoke(message.Data); AnswerPing(message.Data); break;

            case 10: OnPong?.Invoke(message.Data); break;

            default: ForciblyClose(); break;
            }
        }