00106_UDP通信

1、DatagramPacket

  (1)JDK中提供了一个DatagramPacket类,该类的实例对象就相当于一个集装箱,用于封装UDP通信中发送或者接收的数据;

  (2)在创建发送端和接收端的DatagramPacket对象时,使用的构造方法有所不同,接收端的构造方法只需要接收一个字节数组来存放接收到的数据,而发送端的构造方法不但要接收存放了发送数据的字节数组,还需要指定发送端IP地址和端口号;

2、DatagramSocket

  (1)DatagramSocket类的作用就类似于码头,使用这个类的实例对象就可以发送和接收DatagramPacket数据包;

3、UDP网络程序

  (1)要实现UDP通信需要创建一个发送端程序和一个接收端程序,很明显,在通信时只有接收端程序先运行,才能避免因发送端发送的数据无法接收,而造成数据丢失。因此,首先需要来完成接收端程序的编写;

  (2)UDP完成数据的接收

 1 import java.io.IOException;
 2 import java.net.DatagramPacket;
 3 import java.net.DatagramSocket;
 4 import java.net.InetAddress;
 5 
 6 /*
 7  * UDP接收端
 8  * 
 9  * 1,创建DatagramSocket对象
10  * 2,创建DatagramPacket对象
11  * 3,接收数据存储到DatagramPacket对象中
12  * 4,获取DatagramPacket对象的内容
13  * 5,释放流资源
14  */
15 public class UDPReceive {
16     public static void main(String[] args) throws IOException {
17         // 1,创建DatagramSocket对象,并指定端口号
18         DatagramSocket receiveSocket = new DatagramSocket(12306);
19         // 2,创建DatagramPacket对象, 创建一个空的仓库
20         byte[] buffer = new byte[1024];
21         DatagramPacket dp = new DatagramPacket(buffer, 1024);
22         // 3,接收数据存储到DatagramPacket对象中
23         receiveSocket.receive(dp);
24         // 4,获取DatagramPacket对象的内容
25         // 谁发来的数据 getAddress()
26         InetAddress ipAddress = dp.getAddress();
27         String ip = ipAddress.getHostAddress();// 获取到了IP地址
28         // 发来了什么数据 getData()
29         byte[] data = dp.getData();
30         // 发来了多少数据 getLenth()
31         int length = dp.getLength();
32         // 显示收到的数据
33         String dataStr = new String(data, 0, length);
34         System.out.println("IP地址:" + ip + "数据是" + dataStr);
35         // 5,释放流资源
36         receiveSocket.close();
37     }
38 }

  (3)UDP完成数据的发送

 1 import java.io.IOException;
 2 import java.net.DatagramPacket;
 3 import java.net.DatagramSocket;
 4 import java.net.InetAddress;
 5 
 6 /*
 7  * 发送端
 8  * 1,创建DatagramSocket对象
 9  * 2,创建DatagramPacket对象,并封装数据
10  * 3,发送数据
11  * 4,释放流资源
12  */
13 public class UDPSend {
14     public static void main(String[] args) throws IOException {
15         // 1,创建DatagramSocket对象
16         DatagramSocket sendSocket = new DatagramSocket();
17         // 2,创建DatagramPacket对象,并封装数据
18         // public DatagramPacket(byte[] buf, int length, InetAddress address,
19         // int port)
20         // 构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。
21         byte[] buffer = "hello,UDP".getBytes();
22         DatagramPacket dp = new DatagramPacket(buffer, buffer.length,
23                 InetAddress.getByName("192.168.0.4"), 12306);
24         // 3,发送数据
25         // public void send(DatagramPacket p) 从此套接字发送数据报包
26         sendSocket.send(dp);
27         // 4,释放流资源
28         sendSocket.close();
29     }
30 }

  运行结果:

  

原文地址:https://www.cnblogs.com/gzdlh/p/8157147.html