/// <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(); } }
public void SendMessage(TcpMessage tcpMessage) { byte[] data = tcpMessage.ToBytes(); try { Stream.Write(data, 0, data.Length); } catch { } }
/// <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; } } }
/// <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 { } }
/// <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(); }
/// <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); }