Здравствуйте, я впервые пишу клиент-серверное приложение. Хочу написать сервер к которому могут быть одновременно подключенны несколько клиентов, сервер рассылает всем клиентам одно и тоже сообщение. Покурил msdn и удалось только написать приложение соединяющие сервер только с одним клиентом.
Логика Сервера:
Логика Сервера:
Код |
---|
public class ServerManager { private Socket Server; // создаём сокет для сервера private IPHostEntry HostEntry; // информация о хосте private IPAddress Address; // предосталяет коллекцию ip-адресов сервера private IPEndPoint EndPoint; // точка подключения public ServerManager() { CreateConnectPoint(); CreateSocket(); } /// <summary> /// Создание точки подключения /// </summary> public void CreateConnectPoint() { // получаем имя компьютера и выводим его string hostName = Dns.GetHostName(); Console.WriteLine("Computer name: " + hostName); // узнаём имя хоста и выводим его HostEntry = Dns.GetHostEntry(hostName); Console.WriteLine("Host name: " + HostEntry.HostName); // выбираем ip-адрес для создания сервера int serverPort; if (HostEntry.AddressList.Length == 1) { Console.WriteLine("Creating server on: " + HostEntry.AddressList[0]); Address = HostEntry.AddressList[0]; Console.Write("Enter the server port: "); serverPort = int.Parse(System.Console.ReadLine()); } else { Console.WriteLine("---- ---- ---- ----"); Console.WriteLine("IP address list: "); // выводим список всех ip-адресов int addressIndex = 0; foreach (IPAddress tmpAdress in HostEntry.AddressList) { Console.WriteLine(addressIndex + ": " + tmpAdress); addressIndex++; } // спрашиваем пользователя Console.WriteLine("---- ---- ---- ----"); Console.Write("Enter index of adress for creating a server: "); addressIndex = int.Parse(System.Console.ReadLine()); // говорим, где будем создавать сервер Console.WriteLine("Creating server on: " + HostEntry.AddressList[addressIndex]); // получаем адрес, необходимый пользователю Address = HostEntry.AddressList[addressIndex]; Console.Write("Enter the server port: "); serverPort = int.Parse(System.Console.ReadLine()); } // создаем конечную точку подключения EndPoint = new IPEndPoint(Address, serverPort); } /// <summary> /// Создание Сокета Сервера /// </summary> public void CreateSocket() { try { // создаем сокет сервера на текущей машине Server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); Console.WriteLine("Server socket created."); } catch (SocketException error) { // 10061 - порт подключения занят/закрыт if (error.ErrorCode == 10061) { Console.WriteLine("Connection port is closed or busy."); Console.WriteLine("Press any key to exit..."); Console.ReadKey(); } } // прослушивание try { // cвязываем удаленную точку с сокетом Server.Bind(EndPoint); // устанавливаем лимит подключений Server.Listen(10); // ждем подключение клиента while (true) { Console.WriteLine("Waiting connection..."); Server = Server.Accept(); if (Server.Connected) { Console.WriteLine("Connection established."); Console.ReadKey(); break; } } } catch { throw new Exception("Connection problem."); } } // отправка сообщения клиенту public void SendMessage() { string Message; Console.WriteLine("Enter your message:"); Message = Console.ReadLine(); byte[] ByteMsg = Encoding.Unicode.GetBytes(Message); Server.Send(ByteMsg); Console.WriteLine("Message sended."); } } |