static void mainServer_MessageReceived(object sender, MessageEventArgs e) { //Cambiar de color la consola dependiendo de la importancia del mensaje switch (e.M.Importance) { case Level.Critical: Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Mensaje recibido: " + "Hora: " + e.DT.ToShortDateString() + " --> " + e.M.Content + " Criticidad: " + e.M.Importance.ToString()); break; case Level.Debug: Console.ForegroundColor = ConsoleColor.Cyan; Console.WriteLine("Mensaje recibido: " + "Hora: " + e.DT.ToShortDateString() + " --> " + e.M.Content + " Criticidad: " + e.M.Importance.ToString()); break; case Level.Error: Console.ForegroundColor = ConsoleColor.DarkRed; Console.WriteLine("Mensaje recibido: " + "Hora: " + e.DT.ToShortDateString() + " --> " + e.M.Content + " Criticidad: " + e.M.Importance.ToString()); break; case Level.Low: Console.ForegroundColor = ConsoleColor.Gray; Console.WriteLine("Mensaje recibido: " + "Hora: " + e.DT.ToShortDateString() + " --> " + e.M.Content + " Criticidad: " + e.M.Importance.ToString()); break; case Level.Warning: Console.ForegroundColor = ConsoleColor.Yellow; Console.WriteLine("Mensaje recibido: " + "Hora: " + e.DT.ToShortDateString() + " --> " + e.M.Content + " Criticidad: " + e.M.Importance.ToString()); break; case Level.None: default: break; } Console.WriteLine("Mensaje recibido: " + "Hora: " + e.DT.ToShortDateString() + " --> " + e.M.Content + " Criticidad: " + e.M.Importance.ToString() ); }
protected virtual void OnMessageSent(MessageEventArgs e) { if (MessageSent != null) MessageSent(this, e); }
// Receive all incoming packets. private void InteractWithClient(ref TcpClient commChannel, ref BinaryReader netDataReader, ref BinaryWriter netDataWriter) { try { while (commChannel.Client.Connected) // While we are connected. { ControlMessage ctrlMsg = (ControlMessage)Enum.Parse(typeof(ControlMessage), netDataReader.ReadByte().ToString()); /*La instrucción anterior parsea el contenido de un mensaje de control que el cliente envía * previo a colocar cualquier mensaje en el medio de red. * La interacción es básicamente siempre así: * 1. El cliente envía un mensaje de control. * 2. Si el mensaje de control es de tipo CM_Message, el cliente envía: * 2.1 El tamaño del mensaje. * 2.2 Los datos del mensaje serializados. * 3. El servidor parsea el mensaje de control y el mensaje. * 4. El servidor envía una confirmación al cliente indicando que se recibió el mensaje correctamente. * 5. El servidor genera un evento que contiene el mensaje y que puede ser utilizado por la GUI para presentarlo al usuario. */ switch (ctrlMsg) { case ControlMessage.CM_Message: /* * El cliente va a enviar un mensaje. Debemos deserializar el contenido para luego pasarlo a la GUI. */ Message newMsg = new Message(); // Leemos el tamaño del mensaje int sizeOfMsg = netDataReader.ReadInt32(); newMsg = (Message)ObjSerializer.ByteArrayToObject(netDataReader.ReadBytes(sizeOfMsg)); lock (db) { if (db.AddNewMessage(newMsg)) { netDataWriter.Write((Byte)ControlMessage.CM_OK); netDataWriter.Flush(); //Mensaje almacenado en la BD con éxito MessageEventArgs infoMsg = new MessageEventArgs(newMsg, DateTime.Now); OnMessageReceived(infoMsg); //Se dispara el evento y agregamos la información del mensaje recibido // Esto para que la GUI pueda tener acceso al mensaje. } else { netDataWriter.Write((Byte)ControlMessage.CM_Error); netDataWriter.Flush(); //Problemas almacenando mensaje } } break; case ControlMessage.CM_GetMessages: Level msgLevel = (Level)Enum.Parse(typeof(Level), netDataReader.ReadByte().ToString()); Dictionary<int, Message> msgType = db.GetAllMessagesByType(msgLevel); if (msgType.ContainsKey(-1)) { netDataWriter.Write((Byte)ControlMessage.CM_NoMessages); netDataWriter.Flush(); //No hay mensajes evtW.writeInfo("No hay mensajes en la BD"); } else { if (msgType.Count > 0) { netDataWriter.Write((Byte)ControlMessage.CM_OK); netDataWriter.Flush(); //Hay mensajes netDataWriter.Write(ObjSerializer.ObjectToByteArray(msgType).Length); netDataWriter.Write(ObjSerializer.ObjectToByteArray(msgType)); netDataWriter.Flush(); evtW.writeInfo("Hay mensajes en la BD y se enviaron al cliente"); } else { netDataWriter.Write((Byte)ControlMessage.CM_Error); netDataWriter.Flush(); //Mensaje de error al cliente evtW.writeError("Hay errores en la BD"); } } /* * Si existiesen más interacciones entre el cliente y el servidor, se deberían agregar más * cases a este switch según mensajes de control existan y que se envíen desde el cliente. */ break; default: break; } } } catch { netDataWriter.Write((Byte)ControlMessage.CM_Error); netDataWriter.Flush(); } }
/// <summary> /// Envía un mensaje al servidor para que se almacene en la BD /// </summary> /// <param name="clientMsg">Mensaje a enviar al servidor</param> public void SendMessage(Message clientMsg) { try { if (_isConnected) { netDataWriter.Write((Byte)(ControlMessage.CM_Message)); netDataWriter.Write(ObjSerializer.ObjectToByteArray(clientMsg).Length); netDataWriter.Write(ObjSerializer.ObjectToByteArray(clientMsg)); netDataWriter.Flush(); ControlMessage srvAns = (ControlMessage)Enum.Parse(typeof(ControlMessage), netDataReader.ReadByte().ToString()); if (srvAns == ControlMessage.CM_OK) { MessageEventArgs mEa = new MessageEventArgs(clientMsg, DateTime.Now); OnMessageSent(mEa); //Lanzamos el evento de envío exitoso } if (srvAns == ControlMessage.CM_Error) { OnServerError(); //Lanzamos el evento de error en el servidor } } } catch { Console.WriteLine("Error en envío de mensajes"); } }
protected virtual void OnMessageReceived(MessageEventArgs e) { if (MessageReceived != null) MessageReceived(this, e); }