??? 最近用到了MulticastSocket,發現在有些情況下它不能工作,當然這是編碼的問題,是一個BUG,不過這個BUG較少出現,一旦出現了也讓人摸不著頭緒。
??? 由于以前沒有用過這個東東,首先在網上找了個簡單的例子:
??? Server端:
??? Client端:
??? 在公司編譯、運行都正常,回到家里發現Server不能收到broadcast消息了。跟蹤程序也沒有發現問題,網上也沒有找到答案。后來考慮到公司和家 里的網絡情況不同:公司里是通過內網連接到INTERNET;在家則是在局域網上撥號連接到INTERNET,相當于有兩個邏輯的網絡接口卡。于是在上述 例子中增加如下代碼:
??? 再次測試,成功!
??? 總結:使用MulticastSocket時,如果發現broadcast不成功,要注意是否使用了多個網絡接口卡(物理的或邏輯的)。
??? 由于以前沒有用過這個東東,首先在網上找了個簡單的例子:
??? Server端:
?1?import?java.net.DatagramPacket;
?2?import?java.net.InetAddress;
?3?import?java.net.MulticastSocket;
?4?
?5?public?class?Server?{
?6???public?static?void?main(String?[]?arstring)?{
?7?????try?{
?8???????//?Create?a?multicast?datagram?socket?for?receiving?IP
?9???????//??multicast?packets.??Join?the?multicast?group?at
10???????//??230.0.0.1,?port?7777.
11???????MulticastSocket?multicastSocket?=?new?MulticastSocket(7777);
12???????InetAddress?inetAddress?=?InetAddress.getByName("230.0.0.1");
13???????multicastSocket.joinGroup(inetAddress);
14???????//?Loop?forever?and?receive?messages?from?clients.??Print
15???????//??the?received?messages.
16???????while?(true)?{
17?????????byte?[]?arb?=?new?byte?[100];
18?????????DatagramPacket?datagramPacket?=?new?DatagramPacket(arb,?arb.length);
19?????????multicastSocket.receive(datagramPacket);
20?????????System.out.println(new?String(arb));
21???????}
22?????}
23?????catch?(Exception?exception)?{
24???????exception.printStackTrace();
25?????}
26???}
27?}
?2?import?java.net.InetAddress;
?3?import?java.net.MulticastSocket;
?4?
?5?public?class?Server?{
?6???public?static?void?main(String?[]?arstring)?{
?7?????try?{
?8???????//?Create?a?multicast?datagram?socket?for?receiving?IP
?9???????//??multicast?packets.??Join?the?multicast?group?at
10???????//??230.0.0.1,?port?7777.
11???????MulticastSocket?multicastSocket?=?new?MulticastSocket(7777);
12???????InetAddress?inetAddress?=?InetAddress.getByName("230.0.0.1");
13???????multicastSocket.joinGroup(inetAddress);
14???????//?Loop?forever?and?receive?messages?from?clients.??Print
15???????//??the?received?messages.
16???????while?(true)?{
17?????????byte?[]?arb?=?new?byte?[100];
18?????????DatagramPacket?datagramPacket?=?new?DatagramPacket(arb,?arb.length);
19?????????multicastSocket.receive(datagramPacket);
20?????????System.out.println(new?String(arb));
21???????}
22?????}
23?????catch?(Exception?exception)?{
24???????exception.printStackTrace();
25?????}
26???}
27?}
??? Client端:
?1?public?class?Client?{
?2???public?static?void?main(String?[]?arstring)?{
?3?????try?{
?4???????//?Create?a?datagram?package?and?send?it?to?the?multicast
?5???????//??group?at?230.0.0.1,?port?7777.
?6???????for?(;?;)?{
?7?????????byte?[]?arb?=?new?byte?[]{'h',?'e',?'l',?'l',?'o'};
?8?????????InetAddress?inetAddress?=?InetAddress.getByName("230.0.0.1");
?9?????????DatagramPacket?datagramPacket?=
10?????????????????new?DatagramPacket(arb,?arb.length,?inetAddress,?7777);
11?????????MulticastSocket?multicastSocket?=?new?MulticastSocket();
12?//??????multicastSocket.joinGroup(inetAddress);
13?????????multicastSocket.send(datagramPacket);
14???????}
15?????}
16?????catch?(Exception?exception)?{
17???????exception.printStackTrace();
18?????}
19???}
20?}
?2???public?static?void?main(String?[]?arstring)?{
?3?????try?{
?4???????//?Create?a?datagram?package?and?send?it?to?the?multicast
?5???????//??group?at?230.0.0.1,?port?7777.
?6???????for?(;?;)?{
?7?????????byte?[]?arb?=?new?byte?[]{'h',?'e',?'l',?'l',?'o'};
?8?????????InetAddress?inetAddress?=?InetAddress.getByName("230.0.0.1");
?9?????????DatagramPacket?datagramPacket?=
10?????????????????new?DatagramPacket(arb,?arb.length,?inetAddress,?7777);
11?????????MulticastSocket?multicastSocket?=?new?MulticastSocket();
12?//??????multicastSocket.joinGroup(inetAddress);
13?????????multicastSocket.send(datagramPacket);
14???????}
15?????}
16?????catch?(Exception?exception)?{
17???????exception.printStackTrace();
18?????}
19???}
20?}
??? 在公司編譯、運行都正常,回到家里發現Server不能收到broadcast消息了。跟蹤程序也沒有發現問題,網上也沒有找到答案。后來考慮到公司和家 里的網絡情況不同:公司里是通過內網連接到INTERNET;在家則是在局域網上撥號連接到INTERNET,相當于有兩個邏輯的網絡接口卡。于是在上述 例子中增加如下代碼:
multicastSocket.setNetworkInterface(NetworkInterface.getByInetAddress(InetAddress.getLocalHost()));
??? 再次測試,成功!
??? 總結:使用MulticastSocket時,如果發現broadcast不成功,要注意是否使用了多個網絡接口卡(物理的或邏輯的)。