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); }
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); } } }
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); }
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тупить к обслуживанию очередного клиента } } }