??? 最近用到了MulticastSocket,發(fā)現(xiàn)在有些情況下它不能工作,當(dāng)然這是編碼的問題,是一個(gè)BUG,不過這個(gè)BUG較少出現(xiàn),一旦出現(xiàn)了也讓人摸不著頭緒。
??? 由于以前沒有用過這個(gè)東東,首先在網(wǎng)上找了個(gè)簡單的例子:
??? 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?}
??? 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?}
???
在公司編譯、運(yùn)行都正常,回到家里發(fā)現(xiàn)Server不能收到broadcast消息了。跟蹤程序也沒有發(fā)現(xiàn)問題,網(wǎng)上也沒有找到答案。后來考慮到公司和家
里的網(wǎng)絡(luò)情況不同:公司里是通過內(nèi)網(wǎng)連接到INTERNET;在家則是在局域網(wǎng)上撥號(hào)連接到INTERNET,相當(dāng)于有兩個(gè)邏輯的網(wǎng)絡(luò)接口卡。于是在上述
例子中增加如下代碼:
multicastSocket.setNetworkInterface(NetworkInterface.getByInetAddress(InetAddress.getLocalHost()));
??? 再次測試,成功!
??? 總結(jié):使用MulticastSocket時(shí),如果發(fā)現(xiàn)broadcast不成功,要注意是否使用了多個(gè)網(wǎng)絡(luò)接口卡(物理的或邏輯的)。