UDP通信
转自传智播客:
1、 DatagramPacket
在码头发送和接收货物时都需要使用集装箱来装载货物,同样,使用UDP通信时,发送和接收的数据也需要通过集装箱进行传输,这里的集装箱就是一个数据包。在JDK中提供DatagramPacket的类,该类的功能就是封装数据包,用于存放发送或者接收的信息。
DatagramPacket(byte[] buf,int length):
该构造方法在创建DatagramPacket对象时,只指定了数据包的
内存空间(buf)和大小(length),相当于只定义了集装箱的大小。因此,在接收数据时,我们是没法事先就知道哪个地址和端口的Socket会发来数据,就像我们要准备一个集装箱去接收发给我们的货物时,是不用标明发货人或收获人的地址的,所以我们使用该构造方法来创建接收端的DatagramPacket对象。
2、 DatagramSocket
在发送和接收货物都需要使用集装箱,但是只有集装箱还不够,还得有发送和接收集装箱的码头,在JDK中提供了一个类似码头功能的DatagramSocket类,用在接收端和发送端。DatagramSocket类常用的构造方法如下:
DatagramSocket():
该构造方法用于创建发送端的DatagramSocket对象,在创建DatagramSocket对象时,并没有指定端口号,此时,系统会分配一个没有被其它网络程序所使用的端口号。
DatagramSocket(intport):
该构造方法既可用于创建接收端的DatagramSocket对象,还可以创建发送端的DatagramSocket对象,在创建接收端的DatagramSocket对象时,必须要指定一个端口号,这样就可以
监听指定的端口。
3、 UDP网络程序DatagramSocket
通过前面的讲解,我们知道实现UDP通信需要一个发送端程序发送数据和一个接收端程序接收数据。接下来通过两个例程来实现接收端和发送端程序,演示一下UDP通信的过程,由于在UDP通信时,接收端需要先运行,否则数据容易丢失,因此,先带大家来实现接收端程序,代码如下所示:
class="java">package test.net;
import java.net.*;
//接收端程序
public class UDP_Server {
public static void main(String[] args) throws Exception {
DatagramPacket dp = null;
DatagramSocket ds = null;
byte[] buf = new byte[1024]; // 接收数据的数组
ds =new DatagramSocket(8954);
dp =new DatagramPacket(buf, 1024);
System.out.println("等待接收数据");
ds.receive(dp);// 等待接收数据,如果没有数据则会阻塞
String str = new String(dp.getData(), 0, dp.getLength()) + "from "
+dp.getAddress().getHostAddress() + ":" + dp.getPort();
System.out.println(str);
ds.close();//释放资源
}
}
package test.net;
import java.net.*;
//发送端程序
public class UDP_Client {
public static void main(String[] args) throws Exception {
DatagramPacket dp = null;
DatagramSocket ds = null;
ds =new DatagramSocket(3000);
String str = "hello world";//要发送的数据
/*
*创建一个要发送的数据包
*数据包包括发送的数据,数据的长度,接收端的IP地址已经端口号
*/
dp = new DatagramPacket(str.getBytes(), str.length(),
InetAddress.getByName("localhost"),8954);
System.out.println("发送信息");
ds.send(dp);
ds.close();
}
}
上面的代码代表的是一个接收端程序,用来接收数据。在创建DatagramSocket对象时,指定其监听的端口号为8954,创建DatagramPacket对象时传入一个1024大小的字节数组用来接收数据,当调用DatagramSocket的receive(DatagramPacket p)方法接收到数据以后,通过DatagramPacket的getData()方法获取接收到字节数组类型的数据,通过getLength()方法获取接收到数据的长度,然后用String类的构造方法把得到的数据转换成字符串的形式打印出来。
一个发送端程序,DatagramSocket的send()方法用来发送数据。在创建DatagramPacket对象时需要指定目标IP地址和端口号,而且端口号必须要和接收端指定的端口号一致,否则接收端接收不到数据。
在接收端程序阻塞的状态下,运行发送端程序,接收端程序就会收到发送端发送的数据而结束阻塞状态,打印接收的数据。
Have a Nice day!!