示例#1
0
        public static void EncodeMessage(Session session, WebMessage msg)
        {
            // do some complex encode actions here ...

            Encoding encode = Encoding.UTF8;

            Byte[] bytes = null;

            if (msg.IsBinary())
            {
                bytes = msg.RawContent;
            }
            else if (msg.MessageContent.Length > 0)
            {
                bytes           = encode.GetBytes(msg.MessageContent);
                msg.ContentSize = bytes.Length;
            }

            if (bytes == null)
            {
                bytes = new byte[0];
            }

            if (msg.ContentSize <= 0)
            {
                msg.ContentSize = bytes.Length;                       // refresh size
            }
            if (msg.RawContent == null)
            {
                msg.RawContent = bytes;                         // refresh content
            }
            if (msg.RawContent != null && msg.ContentSize > msg.RawContent.Length)
            {
                msg.ContentSize = msg.RawContent.Length;
            }
        }
示例#2
0
        protected virtual void DispatchMessage(object data)
        {
            Session session = null;

            try
            {
                if (m_MessageHandlerManager == null || data == null)
                {
                    return;
                }

                SessionContext ctx = (SessionContext)data;
                session = ctx.Session;
                WebMessage msg = (WebMessage)ctx.Data;

                if (msg.IsString())
                {
                    m_MessageHandlerManager.Dispatch(session, msg.MessageContent);
                }
                else if (msg.IsBinary())
                {
                    if (m_MessageHandlerManager.CanProcessBinary())
                    {
                        m_MessageHandlerManager.Dispatch(session, msg.RawContent);
                    }
                }
            }
            catch (Exception ex)
            {
                try
                {
                    OnError(session, Session.ERROR_RECEIVE, ex);
                }
                catch { }
            }
        }
示例#3
0
        public void Encode(Session session, Object message, MemoryStream stream)
        {
            if (message is WebMessage)
            {
                WebMessage msg = (WebMessage)message;

                EncodeMessage(session, msg);

                Byte[] bytes = msg.RawContent;
                if (bytes == null)
                {
                    bytes = new byte[0];
                }

                bool fin      = true;
                bool rsv1     = false;
                bool rsv2     = false;
                bool rsv3     = false;
                byte opcode   = 8; // if undefined then close it
                bool maskcode = msg.MaskFlag > 0;

                if (msg.IsString())
                {
                    opcode = 0x01;
                }
                else if (msg.IsBinary())
                {
                    opcode = 0x02;
                }
                else if (msg.IsPingFrame())
                {
                    opcode = 0x09;
                }
                else if (msg.IsPongFrame())
                {
                    opcode = 0x0A;
                }
                else if (msg.IsCloseFrame())
                {
                    opcode = 0x08;
                }

                byte payloadlength = 0;

                byte[] mask = maskcode ? new byte[4] {
                    0, 0, 0, 0
                } : new byte[0];
                byte[] extend = new byte[0];

                int length = msg.ContentSize;

                if (length < 126)
                {
                    extend        = new byte[0];
                    payloadlength = (byte)(length & 0xff);
                }
                else if (length < 65536)
                {
                    extend        = new byte[2];
                    payloadlength = 126;
                    extend[0]     = (byte)(length / 256);
                    extend[1]     = (byte)(length % 256);
                }
                else
                {
                    extend        = new byte[8];
                    payloadlength = 127;

                    int left = length;
                    int unit = 256;

                    for (int i = 7; i > 1; i--)
                    {
                        extend[i] = (byte)(left % unit);
                        left      = left / unit;

                        if (left == 0)
                        {
                            break;
                        }
                    }
                }

                byte[] headerbuffer = new byte[2] {
                    0, 0
                };

                if (fin)
                {
                    headerbuffer[0] |= 0x80;
                }
                if (rsv1)
                {
                    headerbuffer[0] |= 0x40;
                }
                if (rsv2)
                {
                    headerbuffer[0] |= 0x20;
                }
                if (rsv3)
                {
                    headerbuffer[0] |= 0x10;
                }

                headerbuffer[0] |= opcode;

                if (maskcode)
                {
                    headerbuffer[1] |= 0x80;
                }

                headerbuffer[1] |= payloadlength;

                stream.Write(headerbuffer, 0, headerbuffer.Length);
                if (extend.Length > 0)
                {
                    stream.Write(extend, 0, extend.Length);
                }
                if (mask.Length > 0)
                {
                    stream.Write(mask, 0, mask.Length);
                }

                if (mask.Length > 0)
                {
                    int masklen = mask.Length;
                    for (int i = 0; i < bytes.Length; i++)
                    {
                        bytes[i] = (byte)(bytes[i] ^ mask[i % masklen]);
                    }
                }

                stream.Write(bytes, 0, length);
            }
            else if (message is byte[])
            {
                Encode(session, new WebMessage(message as byte[]), stream);
            }
            else if (message is string)
            {
                String   msg    = (String)message;
                Encoding encode = Encoding.UTF8;
                Byte[]   bytes  = encode.GetBytes(msg);
                stream.Write(bytes, 0, bytes.Length);
            }
        }