Пример #1
0
        /// <summary>
        /// 初始化一个NetworkStream数据帧
        /// </summary>
        /// <param name="stream"></param>
        /// <param name="headerBuffer"></param>
        public WebSocketDataFrame(NetworkStream stream, byte[] headerBuffer)
        {
            _header = new WebSocketDataFrameHeader(headerBuffer);

            //扩展长度
            if (_header.Length == 126)
            {
                _extend = StreamHelper.Receive(stream, 2);
            }
            else if (_header.Length == 127)
            {
                _extend = StreamHelper.Receive(stream, 8);
            }

            //是否有掩码
            if (_header.HasMask)
            {
                _mask = StreamHelper.Receive(stream, 4);
            }

            //content length
            var content_length = 0L;

            if (_extend.Length == 0)
            {
                content_length = _header.Length;
            }
            else if (_extend.Length == 2)
            {
                content_length = (int)_extend[0] * 256 + (int)_extend[1];
            }
            else
            {
                int n = 1;
                for (int i = 7; i >= 0; i--)
                {
                    content_length += (int)_extend[i] * n;
                    n *= 256;
                }

                if (content_length > int.MaxValue)
                {
                    throw new WebException("Data length transfinite");
                }
            }

            this.Content = StreamHelper.Receive(stream, (int)content_length);
            if (_header.HasMask)
            {
                Mask(this.Content, _mask);
            }
        }
Пример #2
0
        /// <summary>
        /// 初始一个输出内容帧
        /// </summary>
        /// <param name="content"></param>
        /// <param name="isMask"></param>
        /// <param name="opcode"></param>
        public WebSocketDataFrame(byte[] content, bool isMask, WebSocketOpcode opcode = WebSocketOpcode.Text)
        {
            this.Content = content;
            int length = this.Content.Length;

            if (length < 126)
            {
                _extend = new byte[0];
                _header = new WebSocketDataFrameHeader(true, false, false, false, (sbyte)opcode, isMask, length);
            }
            else if (length < 65536)
            {
                _extend    = new byte[2];
                _header    = new WebSocketDataFrameHeader(true, false, false, false, (sbyte)opcode, isMask, 126);
                _extend[0] = (byte)(length / 256);
                _extend[1] = (byte)(length % 256);
            }
            else
            {
                _extend = new byte[8];
                _header = new WebSocketDataFrameHeader(true, false, false, false, (sbyte)opcode, isMask, 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;
                    }
                }
            }
            //
            if (_header.HasMask)
            {
                _mask = Adf.BaseDataConverter.ToBytes(Environment.TickCount + content.GetHashCode());
                Mask(this.Content, _mask);
            }
        }
Пример #3
0
        ///// <summary>
        ///// 初始化内容帧
        ///// </summary>
        ///// <param name="buffer"></param>
        //public WebSocketDataFrame(byte[] buffer)
        //{
        //    //帧头
        //    _header = new WebSocketDataFrameHeader(buffer);

        //    //扩展长度
        //    if (_header.Length == 126)
        //    {
        //        _extend = new byte[2];
        //        Buffer.BlockCopy(buffer, 2, _extend, 0, 2);
        //    }
        //    else if (_header.Length == 127)
        //    {
        //        _extend = new byte[8];
        //        Buffer.BlockCopy(buffer, 2, _extend, 0, 8);
        //    }

        //    //是否有掩码
        //    if (_header.HasMask)
        //    {
        //        _mask = new byte[4];
        //        Buffer.BlockCopy(buffer, _extend.Length + 2, _mask, 0, 4);
        //    }

        //    //消息体
        //    if (_extend.Length == 0)
        //    {
        //        _content = new byte[_header.Length];
        //        Buffer.BlockCopy(buffer, _extend.Length + _mask.Length + 2, _content, 0, _content.Length);
        //    }
        //    else if (_extend.Length == 2)
        //    {
        //        int contentLength = (int)_extend[0] * 256 + (int)_extend[1];
        //        _content = new byte[contentLength];
        //        Buffer.BlockCopy(buffer, _extend.Length + _mask.Length + 2, _content, 0, contentLength > 1024 * 100 ? 1024 * 100 : contentLength);
        //    }
        //    else
        //    {
        //        long len = 0;
        //        int n = 1;
        //        for (int i = 7; i >= 0; i--)
        //        {
        //            len += (int)_extend[i] * n;
        //            n *= 256;
        //        }
        //        _content = new byte[len];
        //        Buffer.BlockCopy(buffer, _extend.Length + _mask.Length + 2, _content, 0, _content.Length);
        //    }

        //    if (_header.HasMask) _content = Mask(_content, _mask);

        //}

        /// <summary>
        /// 初始化一个Socket数据帧
        /// </summary>
        /// <param name="socket"></param>
        /// <param name="headerBuffer"></param>
        public WebSocketDataFrame(Socket socket, byte[] headerBuffer)
        {
            //var header = new WebSocketDataFrameHeader(this.headerBuffer);
            //byte[] extend = new byte[0];

            ////扩展长度
            //if (header.Length == 126)
            //{
            //    extend = SocketHelper.Receive(this.Socket, 2);
            //}
            //else if (header.Length == 127)
            //{
            //    extend = SocketHelper.Receive(this.Socket, 8);
            //}

            ////是否有掩码
            //byte[] _mask = null;
            //if (header.HasMask)
            //{
            //    _mask = SocketHelper.Receive(this.Socket, 4);
            //}

            ////content length
            //var content_length = 0L;
            //if (extend.Length == 0)
            //    content_length = header.Length;
            //else if (extend.Length == 2)
            //    content_length = (int)extend[0] * 256 + (int)extend[1];
            //else
            //{
            //    int n = 1;
            //    for (int i = 7; i >= 0; i--)
            //    {
            //        content_length += (int)extend[i] * n;
            //        n *= 256;
            //    }

            //    if (content_length > int.MaxValue)
            //        throw new WebException("Data length transfinite");
            //}

            //var contentBuffer = SocketHelper.Receive(this.Socket, (int)content_length);
            //if (header.HasMask)
            //{
            //    WebSocketDataFrame.Mask(contentBuffer, _mask);
            //}

            _header = new WebSocketDataFrameHeader(headerBuffer);

            //扩展长度
            if (_header.Length == 126)
            {
                _extend = SocketHelper.Receive(socket, 2);
            }
            else if (_header.Length == 127)
            {
                _extend = SocketHelper.Receive(socket, 8);
            }

            //是否有掩码
            if (_header.HasMask)
            {
                _mask = SocketHelper.Receive(socket, 4);
            }

            //content length
            var content_length = 0L;

            if (_extend.Length == 0)
            {
                content_length = _header.Length;
            }
            else if (_extend.Length == 2)
            {
                content_length = (int)_extend[0] * 256 + (int)_extend[1];
            }
            else
            {
                int n = 1;
                for (int i = 7; i >= 0; i--)
                {
                    content_length += (int)_extend[i] * n;
                    n *= 256;
                }

                if (content_length > int.MaxValue)
                {
                    throw new WebException("Data length transfinite");
                }
            }

            this.Content = SocketHelper.Receive(socket, (int)content_length);
            if (_header.HasMask)
            {
                Mask(this.Content, _mask);
            }
        }