Бесконечный цикл сервера выводящий сообщения - C#

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

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

Проблемка состоит в том, что если клиент как-то аварийно отключится от сервера, например, когда остановить обработку кода, если хоть одно сообщение отправлено, то на сервере начинают выходить пустые сообщения. Как это можно исправить? Вот код сервера: 1)Program
Листинг программы
  1. using System;
  2. using System.Threading;
  3. namespace ChatServer
  4. {
  5. class Program
  6. {
  7. static ServerObject server; // сервер
  8. static Thread listenThread; // потока для прослушивания
  9. static void Main(string[] args)
  10. {
  11. try
  12. {
  13. server = new ServerObject();
  14. listenThread = new Thread(new ThreadStart(server.Listen));
  15. listenThread.Start(); //старт потока
  16. }
  17. catch (Exception ex)
  18. {
  19. server.Disconnect();
  20. Console.WriteLine(ex.Message);
  21. }
  22. }
  23. }
  24. }
2)ServerObject
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Net.Sockets;
  5. using System.Net;
  6. using System.Text;
  7. using System.Threading;
  8. namespace ChatServer
  9. {
  10. public 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. }
3)ClientObject
Листинг программы
  1. using System;
  2. using System.Net.Sockets;
  3. using System.Text;
  4. namespace ChatServer
  5. {
  6. public class ClientObject
  7. {
  8. protected internal string Id { get; private set; }
  9. protected internal NetworkStream Stream { get; private set; }
  10. string userName;
  11. TcpClient client;
  12. ServerObject server; // объект сервера
  13. public ClientObject(TcpClient tcpClient, ServerObject serverObject)
  14. {
  15. Id = Guid.NewGuid().ToString();
  16. client = tcpClient;
  17. server = serverObject;
  18. serverObject.AddConnection(this);
  19. }
  20. public void Process()
  21. {
  22. try
  23. {
  24. Stream = client.GetStream();
  25. // получаем имя пользователя
  26. string message = GetMessage();
  27. userName = message;
  28. message = userName + " вошел в чат";
  29. // посылаем сообщение о входе в чат всем подключенным пользователям
  30. server.BroadcastMessage(message, this.Id);
  31. Console.WriteLine(message);
  32. // в бесконечном цикле получаем сообщения от клиента
  33. while (true)
  34. {
  35. try
  36. {
  37. message = GetMessage();
  38. message = String.Format("{0}: {1}", userName, message);
  39. Console.WriteLine(message);
  40. server.BroadcastMessage(message, this.Id);
  41. }
  42. catch
  43. {
  44. message = String.Format("{0}: покинул чат", userName);
  45. Console.WriteLine(message);
  46. server.BroadcastMessage(message, this.Id);
  47. break;
  48. }
  49. }
  50. }
  51. catch (Exception e)
  52. {
  53. Console.WriteLine(e.Message);
  54. }
  55. finally
  56. {
  57. // в случае выхода из цикла закрываем ресурсы
  58. server.RemoveConnection(this.Id);
  59. Close();
  60. }
  61. }
  62. // чтение входящего сообщения и преобразование в строку
  63. private string GetMessage()
  64. {
  65. byte[] data = new byte[64]; // буфер для получаемых данных
  66. StringBuilder builder = new StringBuilder();
  67. int bytes = 0;
  68. do
  69. {
  70. bytes = Stream.Read(data, 0, data.Length);
  71. builder.Append(Encoding.Unicode.GetString(data, 0, bytes));
  72. }
  73. while (Stream.DataAvailable);
  74. return builder.ToString();
  75. }
  76. // закрытие подключения
  77. protected internal void Close()
  78. {
  79. if (Stream != null)
  80. Stream.Close();
  81. if (client != null)
  82. client.Close();
  83. }
  84. }
  85. }

Решение задачи: «Бесконечный цикл сервера выводящий сообщения»

textual
Листинг программы
  1.  while (true)
  2.                 {
  3.                     try
  4.                     {
  5.                         message = GetMessage();
  6.                         if (message != "")
  7.                         {
  8.                             message = String.Format("{0}: {1}", userName, message);
  9.                             Console.WriteLine(message);
  10.                             server.BroadcastMessage(message, this.Id);
  11.                         }
  12.                         else
  13.                         {
  14.                             message = String.Format("{0}: покинул чат", userName);
  15.                             Console.WriteLine(message);
  16.                             server.BroadcastMessage(message, this.Id);
  17.                             break;
  18.                         }
  19.                     }
  20.                   }

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


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

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

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

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

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

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