예제 #1
0
        /// <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);
            }
        }
예제 #2
0
        /// <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.");
            }
        }
예제 #3
0
        /// <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);
        }