0

我不确定以下情况是否可行。

仅使用 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 方法。

4

1 回答 1

1

答案仍然是“是的,有可能”。基本上,您的问题是描述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的文档。

于 2012-01-06T22:26:17.603 回答