UDP是一种高速,无连接的数据交换方式,他的特点是,即使没有连接到(也不许要连接)接收方也可以封包发送,就像在一个多人使用的步话机环境中,你不知道你的信息是否被需要的人接受到,但是你的信息确实被传递然后消失了,有时候速度比数据完整性重要,在比如视频会议中,丢失几帧画面是可以接受的。但在需要数据安全接受的环境就不适用了。
java中的UDP实现分为两个类:DatagramPacket和 DatagramSocket。DatagramPacket类将数据字节填充到UDP包中,这称为数据报。 DatagramSocket来发送这个包。要接受数据,可以从DatagramSocket中接受一个 DatagramPack对象,然后从该包中读取数据的内容。
这种职责的划分与TCP使用的Socket和ServerSocket有所不同。首先,UDP没有两台主机间唯一连接的概念,它不需要知道对方是哪个远程主机。它可以从一个端口往多个主机发送信息,但是TCP是无法做到的。其次,TCP socket把网络链接看作是流:通过从Socket得到的输入和输出流来收发数据。UDP不支持这一点,你处理总是单个数据包。填充在一个数据报中的所有数据会以包的形式进行发送,这些数据要么作为一个组要么全部接收,要么全部丢弃。一个包不一定与下一个包相关。给定两个包,没有办法知道哪个先发哪个后发。对于流来说,必须提供数据的有序队列,与之不同,数据报会尽可能快的蜂拥到接收方。
发送步骤:
- 使用 DatagramSocket(int port) 建立socket(套间字)服务。
- 将数据打包到DatagramPacket中去
- 通过socket服务发送 (send()方法)
- 关闭资源
- import java.io.IOException;
- import java.net.*;
- public class Send {
- public static void main(String[] args) {
- DatagramSocket ds = null; //建立套间字udpsocket服务
- try {
- ds = new DatagramSocket(8999); //实例化套间字,指定自己的port
- } catch (SocketException e) {
- System.out.println("Cannot open port!");
- System.exit(1);
- }
- byte[] buf= "Hello, I am sender!".getBytes(); //数据
- InetAddress destination = null ;
- try {
- destination = InetAddress.getByName("192.168.1.5"); //需要发送的地址
- } catch (UnknownHostException e) {
- System.out.println("Cannot open findhost!");
- System.exit(1);
- }
- DatagramPacket dp =
- new DatagramPacket(buf, buf.length, destination , 10000);
- //打包到DatagramPacket类型中(DatagramSocket的send()方法接受此类,注意10000是接受地址的端口,不同于自己的端口!)
- try {
- ds.send(dp); //发送数据
- } catch (IOException e) {
- }
- ds.close();
- }
- }
接收步骤:
- 使用 DatagramSocket(int port) 建立socket(套间字)服务。(我们注意到此服务即可以接收,又可以发送),port指定监视接受端口。
- 定义一个数据包(DatagramPacket),储存接收到的数据,使用其中的方法提取传送的内容
- 通过DatagramSocket 的receive方法将接受到的数据存入上面定义的包中
- 使用DatagramPacket的方法,提取数据。
- 关闭资源。
- import java.net.*;
- public class Rec {
- public static void main(String[] args) throws Exception {
- DatagramSocket ds = new DatagramSocket(10000); //定义服务,监视端口上面的发送端口,注意不是send本身端口
- byte[] buf = new byte[1024];//接受内容的大小,注意不要溢出
- DatagramPacket dp = new DatagramPacket(buf,0,buf.length);//定义一个接收的包
- ds.receive(dp);//将接受内容封装到包中
- String data = new String(dp.getData(), 0, dp.getLength());//利用getData()方法取出内容
- System.out.println(data);//打印内容
- ds.close();//关闭资源
- }
- }