2011-05-03 14 views
0

我正在編寫一個基本應用程序,即使用多播和單播通過網絡發送消息的聊天,具體取決於具體情況。到目前爲止,沒有問題,直到前一陣子我開始MulticastSocket部分。我有一個的BindException,當我運行這個基本代碼(我刪除不與我的問題涉及到的部分我所有的其他方法):java中的MulticastSocket:BindException始終

private MulticastSocket socket_multicast; 
private int port; 
private InetAddress multicast_address; 

public void setPort(int p) { 
    port = p; 
} 

public void setMulticastAddress(String s) { 
    try { 
     multicast_address = InetAddress.getByName(s); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

public void joinGroup() { 

    System.out.println("Port : "+port+"\n @IP : "+multicast_address+"\n"); 
    try { 
     socket_multicast = new MulticastSocket(port); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    try { 
     socket_multicast.joinGroup(multicast_address); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

當我運行這段代碼,我有以下的錯誤(我把225.1.1.1和4567在GUI):

Port : 4567 
@IP : /225.1.1.1 
java.net.BindException: Address already in use 
at java.net.PlainDatagramSocketImpl.bind0(Native Method) 
at  
java.net.AbstractPlainDatagramSocketImpl.bind(AbstractPlainDatagramSocketImpl.java:85) 
at java.net.DatagramSocket.bind(DatagramSocket.java:373) 
at java.net.MulticastSocket.<init>(MulticastSocket.java:165) 
at java.net.MulticastSocket.<init>(MulticastSocket.java:130) 
at networkinterface.MulticastIF.joinGroup(MulticastIF.java:61) 

無論哪個IP的combinason和端口我把,總是得到同樣的錯誤。我甚至重新啓動了我的電腦,它沒有改變。

注意事項:爲了測試,我在包視圖中使用右鍵單擊我的類,然後單擊「運行 - > Java應用程序」。當我這樣做時,Eclipse是否創建了某種虛擬機,還是僅使用了回送地址127.0.0.1,或者其他什麼?當我打印InetAddress.getLocalHost()的結果;我有「akee-netbook/127.0.1.1」。由於我使用單播和多播,也許它只使用回送地址,並嘗試綁定已經綁定的地址。如果是這樣,我該如何正確測試我的應用程序?我不知道我是否清楚,如果不清楚,告訴我!

最後一件事,當我打印我的IP地址時爲什麼會出現斜線?它會在稍後成爲問題嗎?或者它是否來自toString()方法?

回答

0

你在linux系統上運行這個嗎?如果是這樣,你有沒有編譯多播到內核或加載模塊?

+0

我在linux系統(Ubuntu 11.04)和模塊:我不知道我應該這樣做,當輸入modprobe時,我沒有發現任何與ip多播有關的任何東西 – Akee 2011-05-03 21:47:31

+0

我不認爲它是一個模塊 - 閱讀它似乎需要在內核中編譯所以我認爲你需要在界面級別打開它:http://manpages.ubuntu.com/manpages/maverick/man8/ifconfig.8.html – Liv 2011-05-03 22:15:35

+0

好,所以這些命令可以使我的卡使用多播,與ifconfig eth0多播。但是我記得前一段時間我在校園裏時,我可以看到一些帶有wireshark的OSPF PDU,也許是錯誤的紀念品?我這樣做,並回報告訴你,如果這工作。無論如何,此外,爲什麼我的本地地址127.0.0.1而不是192.0.1.3,因爲它應該在我的局域網上? O_O – Akee 2011-05-04 07:21:46

0

嗯,我知道我在哪裏出了錯。我正在使用帶有@ IP /端口的UDP套接字(DatagramSocket),然後嘗試使用MulticastSocket再次綁定在相同的@ IP /端口上。由於Multicast使用UDP,我推測我可以對單播和多播流量使用相同的套接字,但它似乎不起作用。 無論如何,感謝對您的答案,對不起,你的時間超過一個的n00b問題,有兩個字符解決:

socket_multicast = new MulticastSocket(port); 

代之以

socket_multicast = new MulticastSocket(port+1); 

-_-」