示例#1
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);
            }
        }