同样的代码!为何在不同的机器是不同的结果!
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):工作在混杂模式下的网卡接收所有的流过网卡的帧,抓包捕获程序就是在这种模式下运行的。
网卡的缺省工作模式包含广播模式
和直接模式
,即它只接收广播帧和发给自己的帧。如果采用混杂模式,一个站点的网卡将接受同一网络内所有站点所发送的数据包这样就可以到达对于网络信息监视捕获的目的。
分享到:
相关推荐
JGroups(Java多播通讯框架)简介 JGroups是一个可靠的群组通讯Java工具包。它基于IP组播(IP multicast),但在可靠性,组成员管理上对它作了扩展。 JGroups的可靠性体现在: 1,对所有接收者的消息的无丢失传输...
Java多播通讯框架 JGroups
java源码:Java多播通讯框架 JGroups.zip
Java多播通讯框架 JGroups.7z
Java多播通讯框架 JGroups源码
Java组播代码,包括接受组播消息,发送组播消息,代码很清晰
java 视屏播放程序 视屏 java 写的视频播放
java实现直播系统,有主播界面,围观界面,可以相互切换,登录权限
java rtsp 模拟播放.。。。。
Java实现视频播放功能
免责声明:资料部分来源于合法的互联网渠道收集和整理,部分自己学习积累成果,供大家学习参考与交流。收取的费用仅用于收集和整理资料耗费时间的酬劳。 本人尊重原创作者或出版方,资料版权归原作者或出版方所有,...
java播放声音
Java 组播组中发送和接受数据实例 3个目标文件。 Java读写文本文件的示例代码 1个目标文件。 java俄罗斯方块 一个目标文件。 Java非对称加密源码实例 1个目标文件 摘要:Java源码,算法相关,非对称加密 Java非...
Java 组播组中发送和接受数据实例 3个目标文件。 Java读写文本文件的示例代码 1个目标文件。 java俄罗斯方块 一个目标文件。 Java非对称加密源码实例 1个目标文件 摘要:Java源码,算法相关,非对称加密 Java非...
java播放pcm文件。
Java实现的视频播放程序源码
Java获取播放文件的时长
多播委托一个很好的事例,此事例解决了多播委托中如果一个方法出现异常,则后面的方法将不能继续的错误!
Java编写的图片播放程序 正序播放 暂停 逆序播放 提供一组可供联系播放的图片
Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...