Advertisement
Dimaland

Client

Apr 1st, 2024
554
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.07 KB | None | 0 0
  1. using System.Net.Sockets;
  2.  
  3. string host = "127.0.0.1";
  4. int port = 8888;
  5. using TcpClient client = new TcpClient();
  6. Console.Write("Введите свое имя: ");
  7. string? userName = Console.ReadLine();
  8. Console.WriteLine($"Добро пожаловать, {userName}");
  9. StreamReader? Reader = null;
  10. StreamWriter? Writer = null;
  11.  
  12. try
  13. {
  14.     client.Connect(host, port); //подключение клиента
  15.     Reader = new StreamReader(client.GetStream());
  16.     Writer = new StreamWriter(client.GetStream());
  17.     if (Writer is null || Reader is null) return;
  18.     // запускаем новый поток для получения данных
  19.     _ = Task.Run(() => ReceiveMessageAsync(Reader));
  20.     // запускаем ввод сообщений
  21.     await BroadcastSendMessageAsync(Writer);
  22. }
  23. catch (Exception ex)
  24. {
  25.     Console.WriteLine(ex.Message);
  26. }
  27. Writer?.Close();
  28. Reader?.Close();
  29.  
  30. // отправка сообщений всем пользователям
  31. async Task BroadcastSendMessageAsync(StreamWriter writer)
  32. {
  33.     // сначала отправляем имя
  34.     await writer.WriteLineAsync(userName);
  35.     await writer.FlushAsync();
  36.     Console.WriteLine("Вы в общем чате");
  37.     Console.WriteLine("Для отправки сообщений введите сообщение и нажмите Enter");
  38.  
  39.     while (true)
  40.     {
  41.         string? message = Console.ReadLine();
  42.         if (message == "2")
  43.             message = await PersonalSendMessageAsync(writer);
  44.         await writer.WriteLineAsync(message);
  45.         await writer.FlushAsync();
  46.     }
  47. }
  48.  
  49. // отправка личных сообщений сообщений
  50. async Task<string?> PersonalSendMessageAsync(StreamWriter writer)
  51. {
  52.     await writer.WriteLineAsync("send to");
  53.     Console.WriteLine("Введите имя человека с которому хотите написать личное сообщение");
  54.     string? name = Console.ReadLine();
  55.     await writer.WriteLineAsync(name);
  56.     await writer.FlushAsync();
  57.     Console.WriteLine("Для отправки сообщений введите сообщение и нажмите Enter");
  58.  
  59.     return Console.ReadLine();
  60. }
  61.  
  62. // получение сообщений
  63. async Task ReceiveMessageAsync(StreamReader reader)
  64. {
  65.     while (true)
  66.     {
  67.         try
  68.         {
  69.             // считываем ответ в виде строки
  70.             string? message = await reader.ReadLineAsync();
  71.             // если пустой ответ, ничего не выводим на консоль
  72.             if (string.IsNullOrEmpty(message)) continue;
  73.             Print(message);//вывод сообщения
  74.         }
  75.         catch
  76.         {
  77.             break;
  78.         }
  79.     }
  80. }
  81. // чтобы полученное сообщение не накладывалось на ввод нового сообщения
  82. void Print(string message)
  83. {
  84.     if (OperatingSystem.IsWindows())    // если ОС Windows
  85.     {
  86.         var position = Console.GetCursorPosition(); // получаем текущую позицию курсора
  87.         int left = position.Left;   // смещение в символах относительно левого края
  88.         int top = position.Top;     // смещение в строках относительно верха
  89.         // копируем ранее введенные символы в строке на следующую строку
  90.         Console.MoveBufferArea(0, top, left, 1, 0, top + 1);
  91.         // устанавливаем курсор в начало текущей строки
  92.         Console.SetCursorPosition(0, top);
  93.         // в текущей строке выводит полученное сообщение
  94.         Console.WriteLine(message);
  95.         // переносим курсор на следующую строку
  96.         // и пользователь продолжает ввод уже на следующей строке
  97.         Console.SetCursorPosition(left, top + 1);
  98.     }
  99.     else Console.WriteLine(message);
  100. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement