之前也写了一个类似飞鸽的小软件,但写得不是很完整,现在也懒得再去动它了.现在回顾下multicastSocket这个类,以备不时之需.
MulticastSocket是种多播,也叫组播.而广播的概念更广.是所有组播放的总合.目前还是很难实现的.因为包的生存一般只在一个router下就over了,如果要让它生存下来,第一就是这个router支持转发.另外就是设置ttl大于1,因为ttl每经过一个router它就会减1,直到它小于0为止.就不再转发.Multicast 它是种UDP,具有加入internet上其他多播主机的"组"的功能.
以下摘自API:
// join a Multicast group and send the group salutations ... String msg = "Hello"; InetAddress group = InetAddress.getByName("228.5.6.7"); MulticastSocket s = new MulticastSocket(6789); s.joinGroup(group); DatagramPacket hi = new DatagramPacket(msg.getBytes(), msg.length(), group, 6789); s.send(hi); // get their responses! byte[] buf = new byte[1000]; DatagramPacket recv = new DatagramPacket(buf, buf.length); s.receive(recv); ... // OK, I'm done talking - leave the group... s.leaveGroup(group);
此时只要加入这个组播组和这个端口就可以收到任何人发的包的.
网间:
跨网间之间的通讯则会比较难于实现,就像飞鸽,如果是跨网段的话,就会找不到这个人,此时我们可以通过添加"要广播主机地址"来完成,它就会给该地址发UDP包.
假如A地址是172.114.2.3而B地址是172.114.4.2那么它两个就是在不同的网段,而此时我们又不想通过加IP,而让A自动去寻找B.要怎么实现呢?
一个想法就是一个个的去发包,通过for循环给从172.114.1.1到172.114.255.255一个个的发包,这样大概算起来要65535个包,如果收到了就给回应,取消发包,这样也是可以找到我们要找的人了.
代码实现如下:(假如我们知道IP范围是在100到125之间,我们一个个的人工去给它们发包了.)
for (int i = 100; i < 125; i++) { group = InetAddress.getByName("192.168.1."+i); ms.send(Util.getDataPacket(group, MULTICAST_PORT, MULTICAST_TEST)); }