Exemple #1
0
        /// <summary>
        /// Выход из чата
        /// </summary>
        private void ExitChat()
        {
            aliveUdpTask = false;
            aliveTcpTask = false;

            string datetime = DateTime.Now.ToString();
            string message  = string.Format("{0} покинул чат", Username);
            string exit     = string.Format("{0} {1}\r\n", datetime, message);

            tbChat.AppendText(exit);

            lock (synlock)
            {
                TcpMessage tcpMessage = new TcpMessage(EXIT_USER, message);
                foreach (ChatUser user in ChatUsers)
                {
                    try
                    {
                        user.SendMessage(tcpMessage);
                        user.Dispose();
                    }
                    catch
                    {
                        MessageBox.Show("Ошибка отправки уведомления о выходе из чата.");
                    }
                }
                ChatUsers.Clear();
            }
        }
Exemple #2
0
 public void SendMessage(TcpMessage tcpMessage)
 {
     byte[] data = tcpMessage.ToBytes();
     try
     {
         Stream.Write(data, 0, data.Length);
     }
     catch { }
 }
Exemple #3
0
        /// <summary>
        /// Прослушивание пользователя чата
        /// </summary>
        /// <param name="user">Пользователь чата</param>
        private void ListenUser(ChatUser user)
        {
            bool firstUser = true;

            while (user.IsOnline)
            {
                try
                {
                    if (user.Stream.DataAvailable)
                    {
                        byte[]     message    = user.RecieveMessage();
                        TcpMessage tcpMessage = new TcpMessage(message);
                        int        code       = tcpMessage.Code;
                        switch (code)
                        {
                        case CONNECT:
                            user.Ip       = tcpMessage.Ip;
                            user.Username = tcpMessage.Username;
                            ChatUsers.Add(user);
                            if (firstUser)
                            {
                                GetHistory(SEND_HISTORY, user);
                                firstUser = false;
                            }
                            break;

                        case MESSAGE:
                            ShowInChat(code, user.Username, tcpMessage.MessageText);
                            break;

                        case EXIT_USER:
                            user.Dispose();
                            ChatUsers.Remove(user);
                            ShowInChat(code, user.Username, tcpMessage.MessageText);
                            break;

                        case SEND_HISTORY:
                            GetHistory(SHOW_HISTORY, user);
                            break;

                        case SHOW_HISTORY:
                            ShowInChat(code, user.Username, tcpMessage.MessageText);
                            break;

                        default:
                            break;
                        }
                    }
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
        }
Exemple #4
0
 /// <summary>
 /// Запрос истории
 /// </summary>
 /// <param name="code">Код, отвечающий за запрос истории или её отправку</param>
 /// <param name="user">Пользователь в чате, который отправляет или получает историю</param>
 private void GetHistory(int code, ChatUser user)
 {
     try
     {
         TcpMessage tcpHistoryMessage;
         if (code == SEND_HISTORY)
         {
             tcpHistoryMessage = new TcpMessage(code, "History");
         }
         else // SHOW_HISTORY
         {
             tcpHistoryMessage = new TcpMessage(code, History);
         }
         user.SendMessage(tcpHistoryMessage);
     }
     catch { }
 }
Exemple #5
0
        /// <summary>
        /// Приём UDP-пакетов от новых пользователей
        /// </summary>
        private void ListenUdpMessages()
        {
            const int REMOTE_UDP_PORT = 8501;
            const int LOCAL_UDP_PORT  = 8502;
            const int TCP_PORT        = 8503;

            aliveUdpTask = true;

            IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Parse(IpAddress), LOCAL_UDP_PORT);
            UdpClient  udpReceiver   = new UdpClient(localEndPoint);

            while (aliveUdpTask)
            {
                try
                {
                    IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, REMOTE_UDP_PORT);
                    byte[]     message        = udpReceiver.Receive(ref remoteEndPoint);
                    UdpMessage receiveMessage = new UdpMessage(message);

                    // Устанавливаем подключение с новым пользователем
                    ChatUser newUser = new ChatUser(receiveMessage.Username, receiveMessage.Ip, TCP_PORT);
                    newUser.Connect();

                    // Отправляем новому пользователю своё имя
                    TcpMessage tcpMessage = new TcpMessage(CONNECT, IpAddress, Username);
                    newUser.SendMessage(tcpMessage);
                    ChatUsers.Add(newUser);

                    Task.Factory.StartNew(() => ListenUser(newUser));

                    context.Post(delegate(object state)
                    {
                        string datetime    = DateTime.Now.ToString();
                        string messageChat = string.Format("{0} {1} присоединился к чату\r\n", datetime, newUser.Username);
                        tbChat.AppendText(messageChat);
                    }, null);
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
            udpReceiver.Dispose();
        }
Exemple #6
0
        /// <summary>
        /// Отправка TCP-пакетов
        /// </summary>
        private void SendTcpMessage()
        {
            string     userMessage = tbMessage.Text;
            TcpMessage tcpMessage  = new TcpMessage(MESSAGE, userMessage);

            foreach (ChatUser user in ChatUsers)
            {
                try
                {
                    user.SendMessage(tcpMessage);
                }
                catch
                {
                    MessageBox.Show(string.Format("Не удалось отправить сообщение пользователю {0}.", user.Username));
                }
            }

            string datetime    = DateTime.Now.ToString();
            string messageChat = string.Format("{0} Вы: {1}\r\n", datetime, userMessage);

            tbChat.AppendText(messageChat);
            tbMessage.Clear();
            History += string.Format("{0} {1}: {2}\r\n", datetime, Username, userMessage);
        }