Exemple #1
0
 public static string DisplayMessage(BObjects.ServerMessage msg)
 {
     if (msg is BObjects.UserMessage)
     {
         var um = msg as BObjects.UserMessage;
         return(um.Nickname + " >> " + um.Message);
     }
     if (msg is BObjects.NewUserMessage)
     {
         var nu = msg as BObjects.NewUserMessage;
         return("Пользователь " + nu.Nickname + " вошёл в чат");
     }
     if (msg is BObjects.QuitUserMessage)
     {
         var qu = msg as BObjects.QuitUserMessage;
         return("Пользователь " + qu.Nickname + " вышел из чата");
     }
     if (msg is BObjects.ShutDownMessage)
     {
         return("Сервер закрывается");
     }
     if (msg is BObjects.LogoutAcceptMessage)
     {
         return("Отсоединение");
     }
     return(string.Empty);
 }
Exemple #2
0
        private void GiveMessage(BObjects.ServerMessage msg)
        {
            if (msg == null)
            {
                return;
            }
            rtbMessages.Invoke((MethodInvoker) delegate
            {
                rtbMessages.Text += "\n" + Helpers.DisplayMessage(msg);                               // выводим полученное сообщение на форму
            });

            foreach (var pair in Nicknames)
            {
                if (pair.Key != "Admin")
                {
                    GivePrivateMessage(msg, pair.Value, pair.Key);
                }
            }
        }
Exemple #3
0
        private void GivePrivateMessage(BObjects.ServerMessage msg, string nodeName, string nickname, string salt = null)
        {
            if (salt == null)
            {
                salt = Salts[nickname];
            }
            uint   BytesWritten = 0;
            string json         = JsonConvert.SerializeObject(msg, Formatting.Indented, new JsonSerializerSettings
            {
                TypeNameHandling = TypeNameHandling.All
            });

            byte[] buff = Encoding.Unicode.GetBytes(json);    // выполняем преобразование сообщения (вместе с идентификатором машины) в последовательность байт

            string pipename = Helpers.ClientPipeName(nodeName, nickname, salt, false);

            Debug.WriteLine("server writes to " + pipename);
            var PipeHandleO = DIS.Import.CreateFile(pipename, DIS.Types.EFileAccess.GenericWrite, DIS.Types.EFileShare.Read, 0, DIS.Types.ECreationDisposition.OpenExisting, 0, 0);

            DIS.Import.WriteFile(PipeHandleO, buff, Convert.ToUInt32(buff.Length), ref BytesWritten, 0);         // выполняем запись последовательности байт в канал
            DIS.Import.CloseHandle(PipeHandleO);
        }
Exemple #4
0
        private void ReceiveMessage()
        {
            string reseviedMessage = ""; // прочитанное сообщение
            uint   realBytesReaded = 0;  // количество реально прочитанных из канала байтов

            // входим в бесконечный цикл работы с каналом
            while (_continue)
            {
                if (DIS.Import.ConnectNamedPipe(PipeHandle, 0))
                {
                    byte[] buff = new byte[1024];                                           // буфер прочитанных из канала байтов
                    DIS.Import.FlushFileBuffers(PipeHandle);                                // "принудительная" запись данных, расположенные в буфере операционной системы, в файл именованного канала
                    DIS.Import.ReadFile(PipeHandle, buff, 1024, ref realBytesReaded, 0);    // считываем последовательность байтов из канала в буфер buff
                    reseviedMessage = Encoding.Unicode.GetString(buff);                     // выполняем преобразование байтов в последовательность символов
                    BObjects.ClientRequest request;
                    Debug.WriteLine("Server got " + reseviedMessage);
                    request = JsonConvert.DeserializeObject <BObjects.ClientRequest>(reseviedMessage, new JsonSerializerSettings
                    {
                        TypeNameHandling = TypeNameHandling.All
                    });

                    BObjects.ServerMessage resultMessage = null;
                    if (request is BObjects.LogInRequest)
                    {
                        var lir = request as BObjects.LogInRequest;
                        if (Nicknames.ContainsKey(lir.nickName))
                        {
                            resultMessage = new BObjects.FailedLoginResult {
                                Message = "Такое имя уже занято"
                            }
                        }
                        ;
                        else
                        {
                            resultMessage = new BObjects.SuccessfulLoginResult();
                        }
                        Thread.Sleep(1000);
                        GivePrivateMessage(resultMessage, lir.nodeName, lir.nickName, lir.salt);
                        if (resultMessage is BObjects.SuccessfulLoginResult)
                        {
                            Salts[lir.nickName] = lir.salt;
                            GiveMessage(new BObjects.NewUserMessage {
                                Nickname = lir.nickName
                            });
                            Nicknames.Add(lir.nickName, lir.nodeName);
                        }
                    }
                    else
                    {
                        if (request is BObjects.LogOutRequest)
                        {
                            var lor = request as BObjects.LogOutRequest;
                            GivePrivateMessage(new BObjects.LogoutAcceptMessage(), lor.nodeName, lor.nickName, Salts[lor.nickName]);
                            Nicknames.Remove(lor.nickName);
                            Salts.Remove(lor.nickName);
                            resultMessage = new BObjects.QuitUserMessage {
                                Nickname = lor.nickName
                            };
                        }
                        else if (request is BObjects.MessageRequest)
                        {
                            var mr = request as BObjects.MessageRequest;
                            resultMessage = new BObjects.UserMessage {
                                Nickname = mr.nickName, Message = mr.Message
                            };
                        }
                        GiveMessage(resultMessage);
                    }


                    DIS.Import.DisconnectNamedPipe(PipeHandle);                             // отключаемся от канала клиента
                    Thread.Sleep(500);                                                      // приостанавливаем работу потока перед тем, как приcтупить к обслуживанию очередного клиента
                }
            }
        }