public void Start() { Consoler.WriteLine("Client #{0} connected!", ConsoleColor.White, uid); HandShake(); wsl = new WSListener(client.GetStream()); wsl.SinglePacketReceived += wsl_SinglePacketReceived; wsl.FragmentReceived += wsl_FragmentReceived; wsl.FragmentedPacketReceived += wsl_FragmentedPacketReceived; wsl.Start(); }
private void ReceivingHandler(int uid, WSPacket packet, string header) { dataTotalLength += (uint)packet.Data.Length; traffic += (uint)packet.HeadersLength; ConsoleColor clr = Console.ForegroundColor; switch (uid) { case 0: clr = ConsoleColor.Cyan; break; case 1: clr = ConsoleColor.Yellow; break; case 2: clr = ConsoleColor.Blue; break; } Consoler.WriteLine(header, clr); switch (packet.Opcode) { case 1: Consoler.WriteLine(byteArrayToString(packet.Data)); break; case 2: Consoler.WriteLine("Получены бинарные данные!", ConsoleColor.Magenta); break; case 8: Consoler.WriteLine("Соединение закрыто удаленной стороной! Код причины: {0}", ConsoleColor.Magenta, ByteManager.Int16FromBytes(packet.Data[0], packet.Data[1])); Stop(); break; case 9: Consoler.WriteLine("Получен пакет 'PING'!", ConsoleColor.Magenta); break; case 10: Consoler.WriteLine("Получен пакет 'PONG'!", ConsoleColor.Magenta); break; } Consoler.WriteLine(); }
private void HandShake() { string request = readHandshakeRequest(); // Выводим в консоль полученные заголовки Consoler.WriteLine("HandShake Received:", ConsoleColor.Red); Consoler.WriteLine(request, ConsoleColor.DarkRed); bool requestStatus = validateRequest(request); string response = ""; if (requestStatus) { // Вычисляем секретный код для WebSocket'a string sec_key = computeSecretKey(request); // Формируем заголовки для "рукопожатия" response += string.Concat(httpVersion != "" ? httpVersion : "HTTP/1.1", " ", 101, " ", "Switching protocols", "\n"); response += "Connection: Upgrade\n"; response += "Upgrade: websocket\n"; response += string.Concat("Sec-Websocket-Accept: ", sec_key, "\n"); response += "\n"; } else { Consoler.WriteLine("Полученный от клиента запрос не валиден! Будет отправлен: '400 Bad request' ответ", ConsoleColor.Magenta); response += string.Concat(httpVersion != "" ? httpVersion : "HTTP/1.1", " ", 400, " ", "Bad request", "\n"); response += "Connection: Upgrade\n"; response += "Upgrade: websocket\n"; response += "\n"; } // Переводим строку в массив байт и посылаем его byte[] responseBuf = Encoding.ASCII.GetBytes(response); client.GetStream().Write(responseBuf, 0, responseBuf.Length); // Выводим в консоль отправленные заголовки Consoler.WriteLine("HandShake Sent:", ConsoleColor.Green); Consoler.WriteLine(response, ConsoleColor.DarkGreen); }