Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System.Net.Sockets;
- string host = "127.0.0.1";
- int port = 8888;
- using TcpClient client = new TcpClient();
- Console.Write("Введите свое имя: ");
- string? userName = Console.ReadLine();
- Console.WriteLine($"Добро пожаловать, {userName}");
- StreamReader? Reader = null;
- StreamWriter? Writer = null;
- try
- {
- client.Connect(host, port); //подключение клиента
- Reader = new StreamReader(client.GetStream());
- Writer = new StreamWriter(client.GetStream());
- if (Writer is null || Reader is null) return;
- // запускаем новый поток для получения данных
- _ = Task.Run(() => ReceiveMessageAsync(Reader));
- // запускаем ввод сообщений
- await BroadcastSendMessageAsync(Writer);
- }
- catch (Exception ex)
- {
- Console.WriteLine(ex.Message);
- }
- Writer?.Close();
- Reader?.Close();
- // отправка сообщений всем пользователям
- async Task BroadcastSendMessageAsync(StreamWriter writer)
- {
- // сначала отправляем имя
- await writer.WriteLineAsync(userName);
- await writer.FlushAsync();
- Console.WriteLine("Вы в общем чате");
- Console.WriteLine("Для отправки сообщений введите сообщение и нажмите Enter");
- while (true)
- {
- string? message = Console.ReadLine();
- if (message == "2")
- message = await PersonalSendMessageAsync(writer);
- await writer.WriteLineAsync(message);
- await writer.FlushAsync();
- }
- }
- // отправка личных сообщений сообщений
- async Task<string?> PersonalSendMessageAsync(StreamWriter writer)
- {
- await writer.WriteLineAsync("send to");
- Console.WriteLine("Введите имя человека с которому хотите написать личное сообщение");
- string? name = Console.ReadLine();
- await writer.WriteLineAsync(name);
- await writer.FlushAsync();
- Console.WriteLine("Для отправки сообщений введите сообщение и нажмите Enter");
- return Console.ReadLine();
- }
- // получение сообщений
- async Task ReceiveMessageAsync(StreamReader reader)
- {
- while (true)
- {
- try
- {
- // считываем ответ в виде строки
- string? message = await reader.ReadLineAsync();
- // если пустой ответ, ничего не выводим на консоль
- if (string.IsNullOrEmpty(message)) continue;
- Print(message);//вывод сообщения
- }
- catch
- {
- break;
- }
- }
- }
- // чтобы полученное сообщение не накладывалось на ввод нового сообщения
- void Print(string message)
- {
- if (OperatingSystem.IsWindows()) // если ОС Windows
- {
- var position = Console.GetCursorPosition(); // получаем текущую позицию курсора
- int left = position.Left; // смещение в символах относительно левого края
- int top = position.Top; // смещение в строках относительно верха
- // копируем ранее введенные символы в строке на следующую строку
- Console.MoveBufferArea(0, top, left, 1, 0, top + 1);
- // устанавливаем курсор в начало текущей строки
- Console.SetCursorPosition(0, top);
- // в текущей строке выводит полученное сообщение
- Console.WriteLine(message);
- // переносим курсор на следующую строку
- // и пользователь продолжает ввод уже на следующей строке
- Console.SetCursorPosition(left, top + 1);
- }
- else Console.WriteLine(message);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement