示例#1
0
        /// <summary>
        /// Reads next message from stream
        /// </summary>
        protected override async Task Read()
        {
            WebSocketReader  reader  = new WebSocketReader();
            WebSocketMessage message = await reader.Read(Stream);

            if (message == null)
            {
                Disconnect();
                return;
            }

            KeepAlive();
            switch (message.OpCode)
            {
            case SocketOpCode.Binary:
            case SocketOpCode.UTF8:
                SetOnMessageReceived(message);
                break;

            case SocketOpCode.Terminate:
                Disconnect();
                break;

            case SocketOpCode.Pong:
                break;

            case SocketOpCode.Ping:
                Pong();
                break;
            }
        }
示例#2
0
        public void FragmentationWithCompressTest()
        {
            var reader = WebSocketReader.Create(true, ProxyConfig.MaxByteArrayLength);
            var tcs1   = new TaskCompletionSource <WebSocketMessage>();

            reader.MessageReceived += message => tcs1.TrySetResult(message);

            var source = "hogefugapiyo";

            byte[] payloadData1;
            using (var stream = new MemoryStream())
            {
                using (var deflate = new DeflateStream(stream, CompressionMode.Compress, true))
                {
                    var sourceBytes = Encoding.UTF8.GetBytes(source);
                    deflate.Write(sourceBytes, 0, sourceBytes.Length);
                }
                payloadData1 = stream.ToArray();
            }

            var frameData1 = new List <byte>
            {
                0b01000010,
                0b00000100
            };

            frameData1.AddRange(payloadData1.Take(4));
            reader.HandleReceive(frameData1.ToArray(), frameData1.Count);

            var frameData2 = new List <byte>
            {
                0b10000000,
                0b00001010
            };

            frameData2.AddRange(payloadData1.Skip(4).ToArray());
            reader.HandleReceive(frameData2.ToArray(), frameData2.Count);

            var message1 = tcs1.GetResult();

            Encoding.UTF8.GetString(message1.PayloadData).Is(source);


            var message2data = new List <byte>
            {
                0b10000010,
                0b00001100
            };

            message2data.AddRange(Encoding.UTF8.GetBytes(source));

            var tcs2 = new TaskCompletionSource <WebSocketMessage>();

            reader.MessageReceived += message => tcs2.TrySetResult(message);
            reader.HandleReceive(message2data.ToArray(), message2data.Count);
            var message2 = tcs2.GetResult();

            Encoding.UTF8.GetString(message2.PayloadData).Is(source);
        }
示例#3
0
 public void TooLongMessageTest()
 {
     var reader1   = WebSocketReader.Create(true, 7);
     var bigFrame1 = new byte[]
     {
         0b10000010, // FIN, Binary
         0b00001000, // noMask, 8bytes
     }
示例#4
0
        private void ListenClient(WebSocketClient client)
        {
            using (Stream ns = GetStream(client)) {
                client.Stream = ns;

                WebSocketReader reader = new WebSocketReader();

                string header        = HttpUtils.ReadHeader(ns);
                Regex  getRegex      = new Regex(@"^GET(.*)HTTP\/1\.1", RegexOptions.IgnoreCase);
                Match  getRegexMatch = getRegex.Match(header);

                if (getRegexMatch.Success)
                {
                    DoHandshake(ns, header);
                    client.Writer = new WebSocketWriter(ns);

                    Clients.Add(client);
                    OnConnect?.Invoke(client);
                }
                else
                {
                    RemoveClient(client);
                }

                while (Running && Clients.IndexOf(client) != -1)
                {
                    WebSocketFrame frame = reader.Read(ns, client);

                    if (frame == null || frame.Opcode == WebSocketOpcode.ConnectionCloseFrame)
                    {
                        RemoveClient(client);
                        break;
                    }

                    if (frame.Opcode == WebSocketOpcode.PongFrame)
                    {
                        client.Pong = true;
                    }
                    else if (frame.Opcode == WebSocketOpcode.TextFrame)
                    {
                        try {
                            string json = Encoding.UTF8.GetString(frame.Data);

                            var message = JsonConvert.DeserializeObject <WebSocketMessage>(json);

                            On[message.ID]?.Invoke(client, new MessageEventArgs(message));
                        } catch (Exception e) { }
                    }
                }
            }
        }
示例#5
0
        private void HandleClient(object td)
        {
            NetComputer comp=(NetComputer)td;
            TcpClient peer=comp.Peer;

            // If the scripting subsystem didn't hook the message
            // it will be handled by the default message handler.

            // Get a stream object for reading and writing
            NetworkStream stream=peer.GetStream();

            WebSocketReader reader=new WebSocketReader(stream);

            bool websocketClosed=false;

            while(websocketClosed==false)
            {
                MessageIn msg=reader.ReadMessage(out websocketClosed);

                if(!websocketClosed)
                {
                    Logger.Write(LogLevel.Debug, "Received message {0} from {1}", (Protocol)msg.getId(), comp);
                    processMessage(comp, msg);
                }
            }

            //Disconnect
            IPEndPoint remoteEndPoint=(IPEndPoint)(peer.Client.RemoteEndPoint);
            Logger.Write(LogLevel.Information, "Client {0}:{1} disconnected", remoteEndPoint.Address, remoteEndPoint.Port);

            // Reset the peer's client information.
            computerDisconnected(comp);
            clients.Remove(comp);
        }
示例#6
0
        public static void HandleBase64(this WebSocketReader reader, string base64)
        {
            var bytes = Convert.FromBase64String(base64);

            reader.HandleReceive(bytes, bytes.Length);
        }
示例#7
0
        public static void HandleReceive(this WebSocketReader reader, string value)
        {
            var bytes = value.HexToBytes();

            reader.HandleReceive(bytes, bytes.Length);
        }
示例#8
0
        public void CompressWithMaskTest()
        {
            var reader = WebSocketReader.Create(true, ProxyConfig.MaxByteArrayLength);
            var tcs1   = new TaskCompletionSource <WebSocketMessage>();

            reader.MessageReceived += message => tcs1.TrySetResult(message);

            var source = "hogefugapiyo";

            byte[] payloadData1;
            using (var stream = new MemoryStream())
            {
                using (var deflate = new DeflateStream(stream, CompressionMode.Compress, true))
                {
                    var sourceBytes = Encoding.UTF8.GetBytes(source);
                    deflate.Write(sourceBytes, 0, sourceBytes.Length);
                }
                payloadData1 = stream.ToArray();
            }


            var maskKey    = new byte[] { 0b11001100, 0b11001100, 0b11111111, 0b00000000 };
            var frameData1 = new List <byte>
            {
                0b11000010,
                0b10001110,
                maskKey[0],
                maskKey[1],
                maskKey[2],
                maskKey[3]
            };

            for (int i = 0; i < payloadData1.Length; i++)
            {
                payloadData1[i] ^= maskKey[i % 4];
            }
            frameData1.AddRange(payloadData1);
            reader.HandleReceive(frameData1.ToArray(), frameData1.Count);

            var message1 = tcs1.GetResult();

            Encoding.UTF8.GetString(message1.PayloadData).Is(source);


            var message2data = new List <byte>
            {
                0b10000010,
                0b10001100,
                maskKey[0],
                maskKey[1],
                maskKey[2],
                maskKey[3]
            };

            var payloadData2 = Encoding.UTF8.GetBytes(source);

            for (int i = 0; i < payloadData2.Length; i++)
            {
                payloadData2[i] ^= maskKey[i % 4];
            }
            message2data.AddRange(payloadData2);

            var tcs2 = new TaskCompletionSource <WebSocketMessage>();

            reader.MessageReceived += message => tcs2.TrySetResult(message);
            reader.HandleReceive(message2data.ToArray(), message2data.Count);
            var message2 = tcs2.GetResult();

            Encoding.UTF8.GetString(message2.PayloadData).Is(source);
        }