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