예제 #1
0
 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("", "Выполнено отключение от чата, попытка переподключения");
     }
 }
예제 #2
0
        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();
            }
        }