問題描述:使用JGroups編寫了一個基於ip_mcast的程序,在同一臺機器上能正常運行,在局域網內的兩臺機器上運行卻找不到對方。
1.覈對兩臺機子的ip,確實在同一子網下。
2.查看運行時輸出,發現兩臺機子綁定的ip一個是ipv6,一個是ipv4。把默認綁定ipv6的那臺機子修改爲它的ipv4地址(-Djgroups.bind_addr=223.3.96.192),再試還是不能相互發現。
3.看了官網manual的"2.8 It doen't work"一章,懷疑學校局域網不支持多播,運行JGroups的tests包下的McastReceiverTest和McastSenderTest,發現多播能正常使用,但Sender發一次消息,Receiver會接收到多次。
4.查看ipconfig,出現幾十個地址,包括十幾個ipv6的地址。
5.懷疑廣播地址或者端口被禁用,在協議棧中配置廣播地址和端口,將它們設置爲3中證實能使用的地址和端口,仍然沒用。
6.安裝虛擬機,在本機和虛擬機上執行程序,地址綁定爲vmware的虛擬網絡地址,仍然不行。
7.安裝虛擬機2,在虛擬機1和虛擬機2上執行程序,地址綁定爲vmware的虛擬網絡地址,居然成功了。
8.實體機上不行,虛擬機上可以,糾結了2天。
9.無意間看了
java -Djava.net.preferIPv4Stack=true org.jgroups.demos.Draw -props /home/bela/udp.xml
The JDK uses IPv6 by default, although is has a dual stack, that is, it also supports IPv4.Here's more details on the subject.
在兩臺主機上運行,啓動時加入
-Djava.net.preferIPv4Stack=true居然成功了。
總結:
1.對官網文檔研究不仔細
2.對ipv6不熟,以爲2.9章和我的程序沒什麼關係。
3.分析能力不夠,根據測試結果:“本機和另一臺機器不成功,本機和虛擬機不成功,虛擬機和虛擬機成功”,應該懷疑是本機的問題。