2012-01-06 74 views
0

我並不確定是否可能出現以下情況。UDP服務器客戶端訂戶發佈者

只使用UdpClient或UDP套接字,我想實現一個發佈者和多個客戶端環境。

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方法。

+0

是的,這是可能的。 – Kiril 2012-01-06 21:47:20

+0

@Lirik好笑。 (我知道我問什麼,所以跳過它)。 – 2012-01-06 22:10:41

+1

對不起,但你基本上描述了UDP協議並詢問是否可能:)。 – Kiril 2012-01-06 22:33:43

回答

1

答案仍然是「是的,這是可能的。」基本上,你的問題是描述UDP protocol,你所問的所有內容都被編入UDP protocol。在UDP協議中,除非用戶明確標識自己(作爲他們發送的數據的一部分),否則您不知道有關訂戶的任何信息。但是,在UDP中,沒有發佈者和訂閱者的概念,只有客戶端。您的客戶可以發送數據,他們可以接收數據,每個連接到管道的客戶端都可以看到每個其他客戶端發佈的內容。

  • 如果您想擁有一個嚴格的發佈者,那麼您只需讓一個客戶端將數據發送到管道。
  • 如果你想擁有一個嚴格的用戶,那麼你只需讓一個給定的客戶端從管道接收數據(就像你在例子中那樣)。

Can the server be that simple as well? Am I missing something?

在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

+0

謝謝。我也是紅色的。 但問題是如果我可以發送數據而不必知道:「www.contoso.com」和11000(ip.port)?這樣,我必須從客戶端發送消息,以便服務器可以響應。有什麼方法可以讓我的客戶只能聽到嗎? (也許我有點不足)。 – 2012-01-06 23:00:48

+0

而服務器,*僅*發送(或者可選地,僅在有監聽器時發送,以釋放資源)。 – 2012-01-06 23:08:05

+0

www.contoso.com地址是所有客戶端都可以看到的UDP管道的地址。每個客戶都必須知道該管道,否則他們不能相互交談。可選的發送受到兩方面的阻礙:很難確定一個聽衆何時連接,這也與您最初的「匿名」要求相沖突。 – Kiril 2012-01-07 01:00:42