同样的代码!为何在不同的机器是不同的结果!
A机器可以接收 自己和别人发送的 多播。
B机器就只接受别人发来的。自己的不接收。
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.MulticastSocket;
import java.net.SocketAddress;
import java.net.SocketTimeoutException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.UnknownHostException;
class MulticastRunnable implements Runnable {
private String url = "multicast://239.255.4.3:6155";
private MulticastSocket mcast;
static int idGenerator = 0;
int id;
public MulticastRunnable(String url) {
this.url = url;
}
public MulticastRunnable() {
}
public void run (){
id = ++idGenerator;
InetAddress inetAddress;
SocketAddress sockAddress;
try {
URI multicastURI;
multicastURI = new URI(url);
inetAddress = InetAddress.getByName(multicastURI.getHost());
sockAddress=new InetSocketAddress(inetAddress, multicastURI.getPort());
mcast=new MulticastSocket(multicastURI.getPort());
mcast.setLoopbackMode(false);
mcast.setTimeToLive(10);
mcast.joinGroup(inetAddress);
mcast.setSoTimeout(10);
byte[] buf=new byte[8192];
DatagramPacket packet=new DatagramPacket(buf,0,buf.length);
while(true) {
// advertize self
String info = "Multicast Client [" +id + "] send a packet.";
System.out.println("debug info : " + info);
byte[] data=info.getBytes();
DatagramPacket sendPacket=new DatagramPacket(data,0,data.length,sockAddress);
mcast.send(sendPacket);
try {
mcast.receive(packet);
if(packet.getLength()>0){
String str=new String(packet.getData(),packet.getOffset(),packet.getLength());
System.out.println("*********"+str);
}
} catch(SocketTimeoutException se){
// ignore
}
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (URISyntaxException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public class BeginnerTest {
public static void main(String[] args) throws InterruptedException {
for (int i = 0; i < 2; ++i) {
Thread t = new Thread(new MulticastRunnable());
t.start();
}
}
}
网卡具有如下的几种工作模式:
- 广播模式(broadcastmodel):它的物理地址(mac)地址是0xffffff的帧为广播帧,工作在广播模式的网卡接收广播帧。
- 多播传送(multicastmodel):多播传送地址作为目的物理地址的帧可以被组内的其它主机同时接收,而组外主机却接收不到。但是,如果将网卡设置为多播传送模式,它可以接收所有的多播传送帧,而不论它是不是组内成员。
- 直接模式(directmodel):工作在直接模式下的网卡只接收目的地址与自己MAC地址匹配的帧。
- 混杂模式(promiscuousmodel):工作在混杂模式下的网卡接收所有的流过网卡的帧,抓包捕获程序就是在这种模式下运行的。
网卡的缺省工作模式包含广播模式 和直接模式 ,即它只接收广播帧和发给自己的帧。如果采用混杂模式,一个站点的网卡将接受同一网络内所有站点所发送的数据包这样就可以到达对于网络信息监视捕获的目的。