一、DatagramPacket类
JDK提供了一个DatagramPacket类,该类的实例对象就相当于一个集装箱,用于封装UDP通信中发送或者接收的数据
二、DatagramSocket类
DatagramPacket数据报的作用相当于“集装箱”,可以将发送端或者接收端的数据封装起来,
DatagramSocket类的作用类似于“码头”,使用这个类的实例对象就可以发送和接收DatagramPacket数据包,
三、UDP网络程序
1、Sender
package cn.itcast.chapter11.example02;
import java.net.*;
/**
* 发送端
*/
public class Sender {
public static void main(String[] args) throws Exception {
// 1、创建一个DatagramSocket对象
DatagramSocket ds = new DatagramSocket(3000);
// 2、要发送的数据
String str = "hello world";
byte[] arr = str.getBytes(); // 将定义的字符串转为字节数组
//3、创建一个要发送的数据包,数据包包括发送的数据,数据的长度,接收端的IP地址以及端口号
DatagramPacket dp = new DatagramPacket(arr, arr.length, InetAddress.getByName("localhost"), 8954);
System.out.println("发送信息");
// 4、发送数据
ds.send(dp);
//5、 释放资源
ds.close();
}
}
3、Receiver
package cn.itcast.chapter11.example02;
import sun.security.util.Length;
import java.net.*;
/**
* 接收端
*/
public class Receiver {
public static void main(String[] args) throws Exception {
// 1、定义一个DatagramSocket对象,监听的端口号为8954
DatagramSocket ds = new DatagramSocket(8954);
// 2、定义一个DatagramPacket对象,用于接收数据
byte[] buf = new byte[1024]; // 创建一个长度为1024的字节数组,用于接收数据
DatagramPacket dp = new DatagramPacket(buf, buf.length);
System.out.println("等待接收数据");
// 3、等待接收数据,如果没有数据则会阻塞
ds.receive(dp);
// 4、调用DatagramPacket的方法获得接收到的信息,包括数据的内容、长度、发送的IP地址和端口号
byte[] data=dp.getData(); //接收到的数据
int length=dp.getLength(); //接收数据的长度
String str =new String(data, 0, length);
String ip=dp.getAddress().getHostAddress();
int port=dp.getPort();
System.out.println(str+" from " + ip + ":" + port); // 打印接收到的信息
// 5、释放资源
ds.close();
}
}
注意:
运行Receive.java有时会出现一种异常,如下图:
因为在一台计算机中,一个端口号只能运行一个程序,而我们编写的UDP程序使用的端口号已经被其他程序占用,
遇到这种情况,可以在cmd窗口输入“netstat -anb”命令来查看当前计算机端口占用情况,