コード例 #1
0
        /// <summary>
        /// Sends a WebSocket frame to the client.
        /// </summary>
        /// <param name="dt">The data to be sent.</param>
        /// <param name="msgType">The type of message sent.</param>
        /// <returns>Completed Task</returns>
        public virtual async Task SendAsync(ArraySegment <byte> dt, WSOpcodeType msgType)
        {
            if (!handShaked)
            {
                return;
            }
            if (disposed)
            {
                return;
            }
            if (closed)
            {
                return;
            }
            var data = dt.Array.SubArray(dt.Offset, dt.Count);

            //if (data.Array == null)
            //throw new ArgumentNullException($"Inner array of argument \"{nameof(data)}\" cannot be equal to null.");
            byte[] d = WSArrayHelpers.ToFrameData(data, msgType);

            if (secure)
            {
                await secureStream.WriteAsync(d, 0, d.Length);
            }
            else
            {
                await client.GetStream().WriteAsync(d, 0, d.Length);
            }

            if (msgType == WSOpcodeType.Close && !disposed)
            {
                await DisposeAsync();
            }
        }
コード例 #2
0
 private Task OnReceive(WebSocketInstance arg1, byte[] arg2, WSOpcodeType arg3)
 {
     if (arg3 == WSOpcodeType.Text)
     {
         Console.WriteLine(Encoding.UTF8.GetString(arg2));
     }
     return(Task.CompletedTask);
 }
コード例 #3
0
        /// <summary>
        /// Converts data into a WebSocket frame.
        /// </summary>
        /// <param name="data">The input data to be converted.</param>
        /// <param name="msgType">The Opcode type of the data.</param>
        /// <returns>A valid WebSocket frame built from the data and Opcode type.</returns>
        public static byte[] ToFrameData(ArraySegment <byte> data, WSOpcodeType msgType)
        {
            byte[] response;
            byte[] bytesRaw = data.Array;
            byte[] frame    = new byte[10];

            int indexStartRawData = -1;
            int length            = bytesRaw.Length;

            frame[0] = (byte)(128 + (int)msgType);
            if (length <= 125)
            {
                frame[1]          = (byte)length;
                indexStartRawData = 2;
            }
            else if (length >= 126 && length <= 65535)
            {
                frame[1]          = (byte)126;
                frame[2]          = (byte)((length >> 8) & 255);
                frame[3]          = (byte)(length & 255);
                indexStartRawData = 4;
            }
            else
            {
                frame[1] = (byte)127;
                frame[2] = (byte)((length >> 56) & 255);
                frame[3] = (byte)((length >> 48) & 255);
                frame[4] = (byte)((length >> 40) & 255);
                frame[5] = (byte)((length >> 32) & 255);
                frame[6] = (byte)((length >> 24) & 255);
                frame[7] = (byte)((length >> 16) & 255);
                frame[8] = (byte)((length >> 8) & 255);
                frame[9] = (byte)(length & 255);

                indexStartRawData = 10;
            }

            response = new byte[indexStartRawData + length];

            int i, reponseIdx = 0;

            //Add the frame bytes to the reponse
            for (i = 0; i < indexStartRawData; i++)
            {
                response[reponseIdx] = frame[i];
                reponseIdx++;
            }

            //Add the data bytes to the response
            for (i = 0; i < length; i++)
            {
                response[reponseIdx] = bytesRaw[i];
                reponseIdx++;
            }

            return(response);
        }