public (string, string) GetMessage() { try { byte[] data = new byte[256]; // буфер для получаемых данных StringBuilder builder = new StringBuilder(); int bytes = 0; //пока есть данные в потоке, запоминай их do { bytes = stream.Read(data, 0, data.Length); builder.Append(Encoding.Unicode.GetString(data, 0, bytes)); }while (stream.DataAvailable); //переведи полученные данные в формат строки string message = builder.ToString(); //отлови пустые сообщения if (message.Length == 0) { return(null, null); } //если сервер отослал ключ шифрования, то запомни его else if (Convert.ToString(message[0]) == ((int)ServerKeys.KEY).ToString()) { key = message.Remove(0, 1); key = key.Remove(32, key.Length - 32); message = message.Remove(0, 33); message = Cr.Decrypt(message, key); } //если ключ уже есть, расшифруй сообщение else if (this.key.Length > 0) { message = RemoveNulls(Cr.Decrypt(message, key)); } return(Convert.ToString(message[0]), message.Remove(0, 1)); } catch { //В случае потери ответа от сервера, отключись и напиши //об этом пользователю Disconnect(); return("", "Выполнено отключение от чата, попытка переподключения"); } }
public void Process() { try { Stream = client.GetStream(); // получаем имя пользователя string message = GetMessage(); if (message[0] == '1') //регистрация { message = message.Remove(0, 1); if (!FileWrite(message).Result) //отклонение регистрации { byte[] reject = Encoding.Unicode.GetBytes("0"); Stream.Write(reject, 0, reject.Length); } } if (message[0] == '2') //авторизация { message = message.Remove(0, 1); if (FileRead(message).Result == 2) //обработать несколько юзеров с одним ником { CryptoClass enc = new CryptoClass(); key = enc.GetStringKey(); //генерация ключа server.Keys(key); Console.WriteLine(key); string keymess = "6" + key; byte[] keym = Encoding.Unicode.GetBytes(keymess); Stream.Write(keym, 0, keym.Length); //отправка ключа string[] name = message.Split(';'); //список юзеров userName = name[0]; user = userName; message = "8" + userName;//connect // посылаем сообщение о входе в чат всем подключенным пользователям server.BroadcastMessage(message, this.Id); //список всех юзеров для новоприбывшего string snames = "7"; server.Usernames(user); List <string> unames = server.Usrnms; for (int i = 0; i < unames.Count; i++) { snames += unames[i] + ";"; } snames = snames.Remove(snames.Length - 1); snames = enc.Encrypt(snames, key); byte[] lnames = Encoding.Unicode.GetBytes(snames); Stream.Write(lnames, 0, lnames.Length); Console.WriteLine(message.Remove(0, 1) + " вошёл в чат"); string[] info = new string[3]; //0 получатель файла, 1 имя.расширение файла, 2 размер файла while (true) //обмен сообщениями { try { message = GetMessage(); message = enc.Decrypt(message, key); if (message[0] == '3')//обычное сообщение { message = message.Remove(0, 1); message = String.Format("3" + userName + ":" + message); Console.WriteLine(message); server.BroadcastMessage(message, this.Id); } if (message[0] == '4')//личка { message = message.Remove(0, 1); string PrivateMsg = message.Substring(message.IndexOf(':') + 1); string PrivateName = message.Substring(0, message.IndexOf(':')); Console.WriteLine(this.userName + " для " + PrivateName + ": " + PrivateMsg); server.PrivateMessage(PrivateName, "4" + this.userName, PrivateMsg); } if (message[0] == 'h')//заголовок файла { message = message.Remove(0, 1); info = message.Split(':'); Console.WriteLine("файл от " + this.userName + " для " + info[0] + ": " + info[1] + " " + info[2]); server.PrivateMessage(info[0], "h" + this.userName, info[1] + ":" + info[2]); } if (message[0] == 'a')//принял передачу { message = message.Remove(0, 1); message = RemoveNulls(message); Console.WriteLine(this.userName + " принял файл от " + message); server.PrivateMessage(message, "a" + this.userName, ""); } if (message[0] == 'r')//отклонил передачу { message = message.Remove(0, 1); message = RemoveNulls(message); Console.WriteLine(this.userName + " отклонил файл от " + message); server.PrivateMessage(message, "r" + this.userName, ""); } if (message[0] == 'f')//приём файла { Console.WriteLine("прием"); message = message.Remove(0, 1); //message = RemoveKosyak(message); GetFile(info[1], message); } if (message[0] == 's')//приём файла { Console.WriteLine("отправка"); SendFile(info[0], info[1]); File.Delete(info[1]); } } catch { message = String.Format("9" + userName);//disconnect Console.WriteLine(message.Remove(0, 1) + " покинул чат"); server.BroadcastMessage(message, this.Id); break; } } } } // в бесконечном цикле получаем сообщения от клиента } catch (Exception e) { Console.WriteLine(e.Message); } finally { // в случае выхода из цикла закрываем ресурсы server.RemoveConnection(this.Id); Close(); } }