UDP服务器客户端订阅服务器

时间:2012-01-06 20:50:34

标签: client udp publisher subscriber

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

仅使用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));
}

服务器也可以这么简单吗? 我错过了什么吗?

其他信息: 使用真正的EXTERNAL IP时,我收到以下错误: 在执行此操作之前,您必须调用Bind方法。

1 个答案:

答案 0 :(得分:1)

答案仍然是“是的,这是可能的。”基本上,您的问题是描述UDP protocol,您询问的所有内容都内置在UDP protocol中。在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的文档。