Ejemplo n.º 1
0
        private void SendHandshake(WsContext wsContext, NetworkStream stream, string data)
        {
            var rows = data.Split(Environment.NewLine);

            rows = rows.Where(x => !string.IsNullOrEmpty(x)).ToArray();

            foreach (var row in rows)
            {
                var pair = row.Split(":");
                if (pair.Length > 1)
                {
                    wsContext.Headers.Add(pair[0].Trim(), pair[1].Trim());
                }
                else
                {
                    wsContext.Headers.Add("Methode", pair[0].Trim());
                }
            }

            Byte[] response = Encoding.UTF8.GetBytes("HTTP/1.1 101 Switching Protocols" + Environment.NewLine
                                                     + "Connection: Upgrade" + Environment.NewLine
                                                     + "Upgrade: websocket" + Environment.NewLine
                                                     + "Sec-WebSocket-Accept: " + Convert.ToBase64String(
                                                         SHA1.Create().ComputeHash(
                                                             Encoding.UTF8.GetBytes(
                                                                 new Regex("Sec-WebSocket-Key: (.*)").Match(data).Groups[1].Value.Trim() + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
                                                                 )
                                                             )
                                                         ) + Environment.NewLine
                                                     + Environment.NewLine);

            stream.Write(response, 0, response.Length);
            _wsController.OnConnect(wsContext);
        }
Ejemplo n.º 2
0
        private void ParseData(WsContext wsContext, out NetworkStream stream, out byte[] formated, out string _data)
        {
            stream = wsContext.TcpClient.GetStream();
            byte[] buffer     = new byte[1024];
            int    byte_count = stream.Read(buffer, 0, buffer.Length);

            formated = new Byte[byte_count];
            Array.Copy(buffer, formated, byte_count); //handle  the null characteres in the byte array
            _data = Encoding.ASCII.GetString(formated);
        }
Ejemplo n.º 3
0
        private void Handle_clients(object wsContext)
        {
            WsContext _wsContext = (WsContext)wsContext;

            while (true)
            {
                ParseData(_wsContext, out NetworkStream stream, out byte[] formated, out string data);
                _wsContext.NetworkStream = stream;

                if (IsHeader(data))
                {
                    SendHandshake(_wsContext, stream, data);
                }
                else
                {
                    var data2 = GetDecodedData(formated, formated.Length);
                    _wsController.OnMessage(_wsContext, new WsData(formated, data, data2));
                }
            }
        }
Ejemplo n.º 4
0
        public void Start()
        {
            TcpListener ServerSocket = new TcpListener(IPAddress.Any, 80);

            ServerSocket.Start();

            while (true)
            {
                TcpClient client = ServerSocket.AcceptTcpClient();

                var gui = Guid.NewGuid().ToString();

                WsContext wsContext = new WsContext(this, client, gui);

                Clients.Add(wsContext);

                //Console.WriteLine("Someone connected!!");

                Thread t = new Thread(Handle_clients);
                t.Start(wsContext);
            }
        }