Многопользовательский чат - C#
Формулировка задачи:
Подскажите, как в таком чате сделать так, чтобы к серверу могли подключаться несколько клиентов, и сообщения получаемые сервером, рассылались всем клиентам?
Сервер
Клиент
Листинг программы
- using System;
- using System.Text;
- using System.Net;
- using System.Net.Sockets;
- using System.Threading;
- namespace SocketServer
- {
- class Program
- {
- static void Main(string[] args)
- {
- // Устанавливаем для сокета локальную конечную точку
- IPHostEntry ipHost = Dns.GetHostEntry("localhost");
- IPAddress ipAddr = ipHost.AddressList[0];
- IPEndPoint ipEndPoint = new IPEndPoint(ipAddr, 11000);
- // Создаем сокет Tcp/Ip
- Socket sListener = new Socket(ipAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
- // Назначаем сокет локальной конечной точке и слушаем входящие сокеты
- try
- {
- sListener.Bind(ipEndPoint);
- sListener.Listen(10);
- // Начинаем слушать соединения
- while (true)
- {
- Console.WriteLine("Ожидаем соединение через порт {0}", ipEndPoint);
- // Программа приостанавливается, ожидая входящее соединение
- Socket handler = sListener.Accept();
- string data = null;
- // Мы дождались клиента, пытающегося с нами соединиться
- byte[] bytes = new byte[1024];
- int bytesRec = handler.Receive(bytes);
- data += Encoding.UTF8.GetString(bytes, 0, bytesRec);
- // Показываем данные на консоли
- Console.Write("Полученный текст: " + data + "\n\n");
- // Отправляем ответ клиенту
- string reply = "Спасибо за запрос в " + data.Length.ToString()
- + " символов";
- byte[] msg = Encoding.UTF8.GetBytes(reply);
- handler.Send(msg);
- if (data.IndexOf("<TheEnd>") > -1)
- {
- Console.WriteLine("Сервер завершил соединение с клиентом.");
- break;
- }
- handler.Shutdown(SocketShutdown.Both);
- handler.Close();
- }
- }
- catch (Exception ex)
- {
- Console.WriteLine(ex.ToString());
- }
- finally
- {
- Console.ReadLine();
- }
- }
- }
- }
Листинг программы
- using System;
- using System.Text;
- using System.Net;
- using System.Net.Sockets;
- using System.Threading;
- namespace SocketClient
- {
- class Program
- {
- static void Main(string[] args)
- {
- try
- {
- SendMessageFromSocket(11000);
- }
- catch (Exception ex)
- {
- Console.WriteLine(ex.ToString());
- }
- finally
- {
- Console.ReadLine();
- }
- }
- static void SendMessageFromSocket(int port)
- {
- // Буфер для входящих данных
- byte[] bytes = new byte[1024];
- // Соединяемся с удаленным устройством
- // Устанавливаем удаленную точку для сокета
- IPHostEntry ipHost = Dns.GetHostEntry("localhost");
- IPAddress ipAddr = ipHost.AddressList[0];
- IPEndPoint ipEndPoint = new IPEndPoint(ipAddr, port);
- Socket sender = new Socket(ipAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
- // Соединяем сокет с удаленной точкой
- sender.Connect(ipEndPoint);
- Console.Write("Введите сообщение: ");
- string message = Console.ReadLine();
- Console.WriteLine("Сокет соединяется с {0} ", sender.RemoteEndPoint.ToString());
- byte[] msg = Encoding.UTF8.GetBytes(message);
- // Отправляем данные через сокет
- int bytesSent = sender.Send(msg);
- // Получаем ответ от сервера
- int bytesRec = sender.Receive(bytes);
- Console.WriteLine("\nОтвет от сервера: {0}\n\n", Encoding.UTF8.GetString(bytes, 0, bytesRec));
- // Используем рекурсию для неоднократного вызова SendMessageFromSocket()
- if (message.IndexOf("<TheEnd>") == -1)
- SendMessageFromSocket(port);
- // Освобождаем сокет
- sender.Shutdown(SocketShutdown.Both);
- sender.Close();
- }
- }
- }
Решение задачи: «Многопользовательский чат»
textual
Листинг программы
- handler.Shutdown(SocketShutdown.Both);
- handler.Close();
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д