/// <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); } }
/// <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); } }
///// <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); } }