.NET 3.x Чат TCP Консоль сервер + WinForm клиент - C#

Узнай цену своей работы

Формулировка задачи:

Чат TCP сервер консоль + WinForm клиент Есть код где Консоль сервер+ Консоль клиент создает Чат но когда это я перевел на Консоль сервер+ WinForm клиент возникает проблема , при отправки через клиент сообщения цикл стает бесконечен к зависанию , как и в WinForm клиент что не хватает в коде этом ? Консоль сервер Winform_Winform_Chat файл Program.cs
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading;
  6. using Server_chat;
  7. namespace Winform_Winform_Chat
  8. {
  9. class Program
  10. {
  11. static ServerObject server; // сервер
  12. static Thread listenThread; // потока для прослушивания
  13. static void Main(string[] args)
  14. {
  15. Title_Console("Сервер Чат v 1.0");
  16. try
  17. {
  18. server = new ServerObject();
  19. listenThread = new Thread(new ThreadStart(server.Listen));
  20. listenThread.Start(); //старт потока
  21. }
  22. catch (Exception ex)
  23. {
  24. server.Disconnect();
  25. Console.WriteLine(ex.Message);
  26. }
  27. }
  28. static void Title_Console(string title)
  29. {
  30. Console.BackgroundColor = ConsoleColor.DarkCyan;
  31. Console.Clear();
  32. Console.ForegroundColor = ConsoleColor.White;
  33. Console.Title = title;
  34. }
  35. static void Pause()
  36. {
  37. Console.ReadKey(true);
  38. }
  39. static void Error_msg(string msg)
  40. {
  41. Console.ForegroundColor = ConsoleColor.Red;
  42. Console.WriteLine(msg);
  43. Console.ForegroundColor = ConsoleColor.White;
  44. }
  45. }
  46. }
Обьект ServerObject.cs к Консоль серверу
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Net;
  5. using System.Net.Sockets;
  6. using System.Text;
  7. using System.Threading;
  8. namespace Server_chat
  9. {
  10. class ServerObject
  11. {
  12. static TcpListener tcpListener; // сервер для прослушивания
  13. List<ClientObject> clients = new List<ClientObject>(); // все подключения
  14. protected internal void AddConnection(ClientObject clientObject)
  15. {
  16. clients.Add(clientObject);
  17. }
  18. protected internal void RemoveConnection(string id)
  19. {
  20. // получаем по id закрытое подключение
  21. ClientObject client = clients.FirstOrDefault(c => c.Id == id);
  22. // и удаляем его из списка подключений
  23. if (client != null)
  24. clients.Remove(client);
  25. }
  26. // прослушивание входящих подключений
  27. protected internal void Listen()
  28. {
  29. try
  30. {
  31. tcpListener = new TcpListener(IPAddress.Any, 8888);
  32. tcpListener.Start();
  33. Console.WriteLine("Сервер запущен. Ожидание подключений...");
  34. while (true)
  35. {
  36. TcpClient tcpClient = tcpListener.AcceptTcpClient();
  37. ClientObject clientObject = new ClientObject(tcpClient, this);
  38. Thread clientThread = new Thread(new ThreadStart(clientObject.Process));
  39. clientThread.Start();
  40. }
  41. }
  42. catch (Exception ex)
  43. {
  44. Console.WriteLine(ex.Message);
  45. Disconnect();
  46. }
  47. }
  48. // трансляция сообщения подключенным клиентам
  49. protected internal void BroadcastMessage(string message, string id)
  50. {
  51. byte[] data = Encoding.Unicode.GetBytes(message);
  52. for (int i = 0; i < clients.Count; i++)
  53. {
  54. if (clients[i].Id != id) // если id клиента не равно id отправляющего
  55. {
  56. clients[i].Stream.Write(data, 0, data.Length); //передача данных
  57. }
  58. }
  59. }
  60. // отключение всех клиентов
  61. protected internal void Disconnect()
  62. {
  63. tcpListener.Stop(); //остановка сервера
  64. for (int i = 0; i < clients.Count; i++)
  65. {
  66. clients[i].Close(); //отключение клиента
  67. }
  68. Environment.Exit(0); //завершение процесса
  69. }
  70. }
  71. }
Обьект ClientObject.cs к Консоль серверу
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Net.Sockets;
  4. using System.Text;
  5. namespace Server_chat
  6. {
  7. class ClientObject
  8. {
  9. protected internal string Id { get; private set; }
  10. protected internal NetworkStream Stream { get; private set; }
  11. string userName;
  12. TcpClient client;
  13. ServerObject server; // объект сервера
  14. public ClientObject(TcpClient tcpClient, ServerObject serverObject)
  15. {
  16. Id = Guid.NewGuid().ToString();
  17. client = tcpClient;
  18. server = serverObject;
  19. serverObject.AddConnection(this);
  20. }
  21. public void Process()
  22. {
  23.  
  24. try
  25. {
  26. Stream = client.GetStream();
  27. // получаем имя пользователя
  28. string message = GetMessage();
  29. userName = message;
  30. message = userName + " вошел в чат";
  31. // посылаем сообщение о входе в чат всем подключенным пользователям
  32. server.BroadcastMessage(message, this.Id);
  33. Console.WriteLine(message);
  34. // в бесконечном цикле получаем сообщения от клиента
  35. while (true)
  36. {
  37. try
  38. {
  39. message = GetMessage();
  40. message = String.Format("{0}: {1}", userName, message);
  41. Console.WriteLine(message);
  42. break;
  43. server.BroadcastMessage(message, this.Id);
  44. Console.ReadKey(true);
  45. //break;
  46. }
  47. catch
  48. {
  49. message = String.Format("{0}: покинул чат", userName);
  50. Console.WriteLine(message);
  51. server.BroadcastMessage(message, this.Id);
  52. break;
  53. }
  54. }
  55. }
  56. catch (Exception e)
  57. {
  58. Console.WriteLine(e.Message);
  59. }
  60. finally
  61. {
  62. // в случае выхода из цикла закрываем ресурсы
  63. server.RemoveConnection(this.Id);
  64. Close();
  65. }
  66. }
  67. // чтение входящего сообщения и преобразование в строку
  68. private string GetMessage()
  69. {
  70. byte[] data = new byte[64]; // буфер для получаемых данных
  71. StringBuilder builder = new StringBuilder();
  72. int bytes = 0;
  73. do
  74. {
  75. bytes = Stream.Read(data, 0, data.Length);
  76. builder.Append(Encoding.Unicode.GetString(data, 0, bytes));
  77. }
  78. while (Stream.DataAvailable);
  79. return builder.ToString();
  80. }
  81. // закрытие подключения
  82. protected internal void Close()
  83. {
  84. if (Stream != null)
  85. Stream.Close();
  86. if (client != null)
  87. client.Close();
  88. }
  89. }
  90. }
И так же WinForm клиент Winform_Winform_Chat файл Form1.cs
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Net.Sockets;
  7. using System.Text;
  8. using System.Threading;
  9. using System.Windows.Forms;
  10. namespace Client_Winform
  11. {
  12. public partial class Form1 : Form
  13. {
  14. public Form1()
  15. {
  16. InitializeComponent();
  17. }
  18. static string userName;
  19. private const string host = "127.0.0.1";
  20. private const int port = 8888;
  21. static TcpClient client;
  22. static NetworkStream stream;
  23. private void Form1_Load(object sender, EventArgs e)
  24. {
  25. }
  26. private void button1_Click(object sender, EventArgs e)
  27. {
  28. client = new TcpClient();
  29. try
  30. {
  31. client.Connect(host, port); //подключение клиента
  32. stream = client.GetStream(); // получаем поток
  33. string message = textBox1.Text;
  34. byte[] data = Encoding.Unicode.GetBytes(message);
  35. stream.Write(data, 0, data.Length);
  36. //// запускаем новый поток для получения данных
  37. Thread receiveThread = new Thread(new ThreadStart(ReceiveMessage));
  38. receiveThread.Start(); //старт потока
  39. //Console.WriteLine("Добро пожаловать, {0}", userName);
  40. SendMessage();
  41. }
  42. catch (Exception ex)
  43. {
  44. Console.WriteLine(ex.Message);
  45. }
  46. finally
  47. {
  48. Disconnect();
  49. }
  50. }
  51. // отправка сообщений
  52. private void SendMessage()
  53. {
  54.  
  55. while (true)
  56. {
  57. //Console.Write("Введите сообщение: ");
  58. //string message = Console.ReadLine();
  59. byte[] data = Encoding.Unicode.GetBytes(textBox1.Text);
  60. stream.Write(data, 0, data.Length);
  61. }
  62. }
  63. // получение сообщений
  64. private void ReceiveMessage()
  65. {
  66. while (true)
  67. {
  68. try
  69. {
  70. byte[] data = new byte[64]; // буфер для получаемых данных
  71. StringBuilder builder = new StringBuilder();
  72. int bytes = 0;
  73. do
  74. {
  75. bytes = stream.Read(data, 0, data.Length);
  76. builder.Append(Encoding.Unicode.GetString(data, 0, bytes));
  77. }
  78. while (stream.DataAvailable);
  79. string message = builder.ToString();
  80. richTextBox1.AppendText(message);
  81. //Console.WriteLine(message + "\n");//вывод сообщения
  82. }
  83. catch
  84. {
  85. Console.WriteLine("Подключение прервано!"); //соединение было прервано
  86. Console.ReadLine();
  87. Disconnect();
  88. }
  89. }
  90. }
  91. static void Disconnect()
  92. {
  93. if (stream != null)
  94. stream.Close();//отключение потока
  95. if (client != null)
  96. client.Close();//отключение клиента
  97. //Environment.Exit(0); //завершение процесса
  98. }
  99. }
  100. }
Вот и архив с этим примером Суть такая что на консоли клиента и сервера этот пример работает как только код перегнать на сервер, и Winform клиент то пример не работает, циклиться к зависанию явно что то не хватает , я пробывал решить, но не получилось ходил по кругу , как не крути не получаеться Надеюсь кто то знает , то его не хватает в этом коде товарищи?

Решение задачи: «.NET 3.x Чат TCP Консоль сервер + WinForm клиент»

textual
Листинг программы
  1. listBox1.Items.Add(GetMessage());

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 3.8 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы