UDP Server Client Subscriber Publisher - PullRequest
       55

UDP Server Client Subscriber Publisher

0 голосов
/ 07 января 2012

Я не совсем уверен, возможен ли следующий сценарий.

Используя только UdpClient или Udp Socket, я хотел бы создать среду с одним издателем и несколькими клиентами.

Сервер UDP вещает на изолированной машине через Интернет. Один или несколько клиентов «подписываются» или «отписываются» по мере необходимости, таким образом получая трансляцию.

Возможно ли? Спасибо.

РЕДАКТИРОВАТЬ: Если так, может ответ ответчик уточнил?

РЕДАКТИРОВАТЬ: это возможно без отслеживания подписчиков?

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ:

Существующий, код клиента:

IPEndPoint IPEP = new IPEndPoint(IPAddress.Parse("EXTERNAL IP"), PORT);
UdpClient UC = new UdpClient();
byte[] REZ;
while (true)
{
    REZ = UC.Receive(ref IPEP);
     Console.WriteLine("REC: " + Encoding.ASCII.GetString(REZ));
}

Может ли сервер быть таким простым? Я что-то упустил?

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ: При использовании реального ВНЕШНЕГО IP я получаю следующую ошибку: Вы должны вызвать метод Bind перед выполнением этой операции.

1 Ответ

1 голос
/ 07 января 2012

Ответ все еще «Да, это возможно».По сути, ваш вопрос описывает протокол UDP , все, о чем вы спрашиваете, встроено в протокол UDP .В протоколе UDP вы ничего не знаете об абонентах, если они явно не идентифицируют себя (как часть отправляемых данных).Однако в UDP нет понятия издатель и подписчик, есть только клиенты.Ваши клиенты могут отправлять данные, и они могут получать данные, и каждый клиент, подключенный к каналу, может видеть, что публикуется любым другим клиентом.

  • Если вы хотите иметь строгого издателя, то вы просто заставляете одного клиента отправлять данные в канал.
  • Если вы хотите иметь строгого подписчика, тогда вы просто делаетеданный клиент получает данные из канала (как и в вашем примере).

Может ли сервер быть таким простым?Я что-то упустил?

В UDP технически нет клиента и сервера, каждая конечная точка является клиентом.Но ответ (опять же): да, сервер тоже может быть таким простым:

UdpClient udpClient = new UdpClient("www.contoso.com", 11000);
Byte[] sendBytes = Encoding.ASCII.GetBytes("Is anybody there");
try
{
    udpClient.Send(sendBytes, sendBytes.Length);
}
catch ( Exception e )
{
    Console.WriteLine( e.ToString());
}

Приведенный выше код был взят непосредственно из документации для UdpClient.Send .

...