Здравствуйте, я впервые пишу клиент-серверное приложение. Хочу написать сервер к которому могут быть одновременно подключенны несколько клиентов, сервер рассылает всем клиентам одно и тоже сообщение. Покурил 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.");
}
} |


























