/// <summary> /// Слушает входящие сообщения пока "живо" соединение. /// </summary> private void ReceiveMessages() { alive = true; try { while (alive) { byte[] data = new byte[64]; StringBuilder builder = new StringBuilder(); int bytes = 0; do { bytes = stream.Read(data, 0, data.Length); builder.Append(Encoding.Unicode.GetString(data, 0, data.Length)); } while (stream.DataAvailable); string message = builder.ToString(); // добавляем полученное сообщение в текстовое поле context.Post(delegate(object state) { MainChatTextBox.AppendText(message + Environment.NewLine); }, null); } } catch (Exception ex) { if (!alive) { return; } MessageBox.Show(ex.Message); Disconnect(); } }
private void SendMessageBtn_Click(object sender, RoutedEventArgs e) { try { string message = String.Format(MessageTextBox.Text); byte[] data = Encoding.Unicode.GetBytes(message); stream.Write(data, 0, data.Length); MessageTextBox.Clear(); MainChatTextBox.AppendText(Environment.NewLine + "Вы: " + message); } catch (Exception ex) { MessageBox.Show(ex.Message); } }
/// <summary> /// Разрывает соединение с сервером (выход из чата) /// </summary> private void Disconnect() { alive = false; // уведомляем сервер о разрыве соединения byte[] data = Encoding.Unicode.GetBytes("ext0"); stream.Write(data, 0, data.Length); if (stream != null && stream.CanWrite) { stream.Close(); } if (client != null) { client.Close(); } MainChatTextBox.AppendText(Environment.NewLine + "Вы вышли из чата."); ChangeViewElementsAccessibility(false); }
/// <summary> /// Заходит в чат с ником, указанным в NickTextBox или с уникальным ником типа "Guest...". /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void EnterChatBtn_Click(object sender, RoutedEventArgs e) { if (!String.IsNullOrEmpty(NickTextBox.Text)) { userName = NickTextBox.Text; } else { userName = "******" + Guid.NewGuid().ToString(); } try { client = new TcpClient(); client.Connect(HOST, PORT); stream = client.GetStream(); byte[] data = Encoding.Unicode.GetBytes(userName); stream.Write(data, 0, data.Length); // запускаем задачу на прием сообщений (предпочтительно) Task receiveTask = new Task(ReceiveMessages); receiveTask.Start(); // так тоже работает...вроде XD //Thread receiveTask = new Thread(new ThreadStart(ReceiveMessages)); //receiveTask.Start(); MainChatTextBox.AppendText(Environment.NewLine + "Добро пожаловать " + userName); ChangeViewElementsAccessibility(true); } catch (Exception ex) { MessageBox.Show(ex.Message); Disconnect(); } }
private void MainChatTextBox_TextChanged(object sender, TextChangedEventArgs e) { MainChatTextBox.ScrollToEnd(); }