/// <summary> /// обработчик получамых сообщений /// </summary> /// <param name="asyncResult"> /// The async result. /// </param> /// <exception cref="ArgumentOutOfRangeException"> /// </exception> private void OnReceive(IAsyncResult asyncResult) { try { lock (udpServer) { var endPoint = new IPEndPoint(IPAddress.Any, 0); if (udpServer.Client == null) { return; } var bytes = udpServer.EndReceive(asyncResult, ref endPoint); var message = Message.FromBytes(bytes); switch (message.Type) { case MessageType.Login: OnLoginMessage(message as LoginMessage, endPoint); break; case MessageType.Logout: OnLogoutMessage(message, endPoint); break; case MessageType.ChatMessage: OnChatMessage(message as ChatMessage, endPoint); break; default: throw new ArgumentOutOfRangeException(); } udpServer.BeginReceive(this.OnReceive, null); } } catch (Exception ex) { serverView.ShowException(ex); } }
/// <summary> /// Обработчик сообщения о выходе пользоватя /// </summary> /// <param name="message"> /// Сообщение о выходе из чата /// </param> /// <param name="endPoint"> /// Адрес отправителя сообещния /// </param> private void OnLogoutMessage(Message message, IPEndPoint endPoint) { var logoutContact = this.GetContactByEndPoint(endPoint); if (logoutContact != null) { contacts.Remove(logoutContact); // Отсылаем подтверждение об удалении пользователя на сервере this.SendLogoutAcceptedMessage(logoutContact); // Отсылаем обновленный список контактов всем пользователям BroadcastContactsMessage(); WriteLog(string.Format("\'{0}\' has escaped the chat.", logoutContact.Name)); } else { SendChatMessage(new Contact(string.Empty, endPoint), "There is no contact with this endpoint."); } }
/// <summary> /// Отправить сообщение /// </summary> /// <param name="message"> /// Модель сообщения /// </param> /// <param name="endPoint"> /// адрес получателя сообщения /// </param> private void SendMessage(Message message, IPEndPoint endPoint) { var bytes = message.ToBytes(); udpServer.Send(bytes, bytes.Length, endPoint); }