一、InetAddress 类
java
InetAddress address1=InetAddress.getLocalHost();
该命令用于获取本机主机信息,返回主机名与 IP 地址,不过如果本机有多个网卡的话,返回的 IP 地址并不一定是目前正在联网的那个。
java
InetAddress address2=InetAddress.getByName("DESKTOP-MINYU");
InetAddress address2=InetAddress.getByName("192.168.0.106");
该命令的参数可以是主机名,也可以是 IP 地址。当参数是主机名时,如果是本机主机名,则效果与**InetAddress.getLocalHost()**相同,也就是说返回的主机信息中的 IP 地址不一定是我们想要的。当参数是 IP 地址时,返回的就是输入的 IP 地址。
二、DatagramSocket 类
采用 UDP 通信的类为 DatagramSocket 类,其特点是事先不需要建立连接,发出去的数据对方能收到就收到,收不到拉倒。
在编写代码的时候需要用到 DatagramPacket 类,主要作用是对数据进行打包,然后交由 DatagramSocket 进行发送或接收。
发送端示例:
java
public static void main(String args[])
{
DatagramSocket ds=new DatagramSocket();
//建立 Socket 对象,没有参数表明可以使用本机的任何端口进行发送。
String x="hello";
byte[] bytes=x.getBytes();
InetAddress address=InetAddress.getByName("192.168.0.106");
int port=10086;
DatagramPacket dp=new DatagramPacket(bytes,bytes.length,address,port);
//打包数据,对方IP是192.168.0.106,对方端口号是10086.
ds.send(dp);
//发送数据
ds.close();
//关闭资源
}
接收端示例:
java
public static void main(String args[])
{
DatagramSocket ds=new DatagramSocket(10086);
//建立 Socket 对象,用于接收本机10086端口的数据。
byte[] bytes=new byte[1024];
DatagramPacket dp=new DatagramPacket(bytes,bytes.length);
//打包数据,将后续接收到的数据打包进bytes字节数组里。
ds.receive(dp);
//接收数据
byte[] x=dp.getData();
int length=dp.getLength();
//解析数据
System.out.println(new String(x,0,length));
}
三、MulticastSocket 类
该类用于组播,替换单播的 DatagramSocket 类。
组播地址范围:224.0.0.0~224.0.0.255
发送端示例:
java
public static void main(String args[])
{
MulticastSocket ms=new MulticastSocket();
//建立 Socket 对象,没有参数表明可以使用本机的任何端口进行发送。
String x="hello";
byte[] bytes=x.getBytes();
InetAddress address=InetAddress.getByName("224.0.0.1");
int port=10086;
DatagramPacket dp=new DatagramPacket(bytes,bytes.length,address,port);
//打包数据,组播IP是192.168.0.106,对方端口号是10086.
ms.send(dp);
//发送数据
ms.close();
//关闭资源
}
接收端示例:
java
public static void main(String args[])
{
MulticastSocket ms=new MulticastSocket(10086);
//建立 Socket 对象,用于接收本机10086端口的数据。
InetAddress address=InetAddress.getByName("224.0.0.1");
ms.joinGroup(address);
//将本机套接字加入组播地址
byte[] bytes=new byte[1024];
DatagramPacket dp=new DatagramPacket(bytes,bytes.length);
//打包数据,将后续接收到的数据打包进bytes字节数组里。
ms.receive(dp);
//接收数据
byte[] x=dp.getData();
int length=dp.getLength();
//解析数据
System.out.println(new String(x,0,length));
}
四、广播
广播的代码实现与单播基本一样,只需要将地址改为 255.255.255.255 即表明向局域网内所有主机发送数据。