2012-12-13 78 views
3
MulticastSocket multicast_socket = new MulticastSocket(Dialogos.MULTICAST_PORTA); 
InetAddress group = InetAddress.getByName(Dialogos.MULTICAST_IP_GRUPO); 
multicast_socket.joinGroup(group); 
byte[] msg = new byte[1024]; 
DatagramPacket packet = new DatagramPacket(msg, msg.length); 
multicast_socket.receive(packet); 

在上面的代碼中,服務器正在通過多播從客戶端接收請求。服務器現在應該讓客戶知道它在哪裏。這只是客戶猜測連接的一種方法,並不完全依賴於它。改進我從客戶端獲取服務器IP地址的方式

儘管服務器可以安裝在許多不同的環境中,所以我不知道將使用哪個接口/地址與客戶端進行通信。因此,爲了告訴客戶端它在哪裏,我正在編譯服務器中的所有可用IP地址,並將它們全部發送回多播,以便客戶端可以嘗試它們直到成功。

我的問題:有沒有辦法改進這種機制?我想知道,在服務器應用程序中,我是否可以獲得從客戶端接收多播的本地IP,然後我知道要發回哪一個。找不到能做到的方法。也許某種方式嘗試連接到客戶端只是爲了知道它會選擇哪個本地地址?

回答

2

只要將單播UDP數據包發送回客戶端,客戶端就能夠提取源IP地址。這將確保它是客戶端和服務器可以相互通信的接口/路由上的地址。當然,您需要該數據包以某種方式告訴偵聽端口號。

+0

+1,但源端口位於DatagramPacket中,就像源地址一樣。數據包因此可以是空的,除非它需要以某種方式識別服務器。 – EJP

+0

是的,沒錯,但我認爲這裏的意圖是在某些*其他*端口或甚至協議上宣傳服務,例如告訴客戶端與TCP連接的位置。 –

相關問題