p2p网络中的节点只要能获得对方的ip地址和端口号就能发出通信请求,实现发现服务一般有两种方法:一是简单的显示点到点的配置,另一种是每个节点都维护其它一些节点的ip和端口目录,节点可以通过搜索这些目录去发现理想的节点。p2p网络中可以使用ip多播进行节点发现。发现角色分为发送端和接收端。
发送端:主要过程为DatagramPacket类建立数据报,再用MulticastSocket类将其发送出去
(1)建立框架
//---------------------------------------------------------------------------------
package NetPackage;
public class Sender
{
public static void main(String[] args)
{
}
}
//---------------------------------------------------------------------------------
(2)建立DatagramPacket对象
DatagramPacket datagramPacket=new DatagramPacket(byte[] buf, int length, InertAddressaddress, int port);
//---------------------------------------------------------------------------------
package NetPackage;
public class Sender
{
public static void main(String[] args)
{
DatagramPacket datagramPacket=new DatagramPacket(buf,length,address,port);
}
}
//---------------------------------------------------------------------------------
(3)建立MulticastSocket对象,把数据报datagramPacket发送出去
MulticastSocket muLticastSocket=new MulticastSocket();
multicastSocket.send(datagramPacket);
//-----------------------------------------------------------------------------------------
package NetPackage;
public class Sender
{
public static void main(String[] args)
{
DatagramPacket datagramPacket=new DatagramPacket(buf,length,address,port);
MulticastSocket muLticastSocket=new MulticastSocket();
multicastSocket.send(datagramPacket);
}
}
//-----------------------------------------------------------------------------------------
(4)完善参数定义
//-----------------------------------------------------------------------------------------
package NetPackage;
public class Sender
{
public static void main(String[] args)
{
byte[] buf=new byte[] {'H','e','l','l','o'};
InetAddress inetAddress=InetAddress.getByName("230.0.0.1");
DatagramPacket datagramPacket=new DatagramPacket(buf,buf.length,inetAddress,7777);
MulticastSocket muLticastSocket=new MulticastSocket();
multicastSocket.send(datagramPacket);
}
}
//-----------------------------------------------------------------------------------------
(5)完善包的导入和异常处理
//-----------------------------------------------------------------------------------------
package NetPackage;
import java.net.*;
public class Sender
{
public static void main(String[] args)
{
try
{
byte[] buf=new byte[] {'H','e','l','l','o'};
InetAddress inetAddress=InetAddress.getByName("230.0.0.1");
DatagramPacket datagramPacket=new DatagramPacket(buf,buf.length,inetAddress,7777);
MulticastSocket muLticastSocket=new MulticastSocket();
multicastSocket.send(datagramPacket);
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
//-----------------------------------------------------------------------------------------
由于多播地址必须选用D类地址,因此选用类230.0.0.1,端口号选择类1024~65535间的7777。
接收端:MuticastSocket.joinGroup(...)加入多播组的方式获得消息
//-----------------------------------------------------------------------------------
package NetPackage;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
public class Receiver
{
public static void main(String[] arstring)
{
try
{
MulticastSocket multicastSocket = new MulticastSocket(7777);
InetAddress inetAddress = InetAddress.getByName("230.0.0.1");
multicastSocket.joinGroup(inetAddress);
while (true)
{
byte[] arb = new byte[100];
DatagramPacket datagramPacket = new DatagramPacket(arb,arb.length);
multicastSocket.receive(datagramPacket);
System.out.println(new String(arb));
}
}
catch (Exception exception)
{
exception.printStackTrace();
}
}
}
//-----------------------------------------------------------------------------------