UDP 网络编程
- UDP 和 TCP 一样,都属于网络中传输层的协议,和 TCP 不同的是,UDP 是一种相对不可靠的传输控制协议。采用 UDP 方式进行通信时,不需要先建立连接,故而速度快。数据发送时需要封装成数据包,就像把信件装入信封一样;
1. DatagramPacket 类
- UDP 是一种面向无连接的协议,因此,在通信时发送端和接收端不用建立连接。JDK 中提供了 DatagramPacket 类,该类的实例对象就相当于一个集装箱,用于封装 UDP 通信中发送或者接收的数据;
- 想要创建一个 DatagramPacket 对象,首先需要了解一下它的构造方法。在创建发送端和接收端的 DatagramPacket 对象时,使用的构造方法有所不同,接收端的构造方法只需要接收一个字节数组来存放接收到的数据,而发送端的构造方法不但要接收存放了发送数据的字节数组,还需要指定发送端的 IP 地址和端口号;
- DatagramPacket 类中常用的构造方法:
(1)DatagramPacket(byte[] buf,int length)
(2)DatagramPacket(byte[] buf,int length,InetAddress addr,int port)
(3)DatagramPacket(byte[] buf,int offset,int length)
(4)DatagramPacket(byte[] buf,int offset,int length,InetAddress addr,int port)
- java.net.DatagramPacket,详见:Class DatagramPacket;
2. DatagramSocket 类
- 使用该类的实例对象就可以发送和接收 DatagramPacket 数据包;
- DatagramSocket 类中常用的构造方法:
(1)DatagramSocket()
(2)DatagramSocket(int port)
(3)DatagramSocket(int port,InetAddress addr)
- java.net.DatagramSocket,详见:Class DatagramSocket;
3. UDP 网络编程
- UDP 和 TCP 实现的功能类似,要求服务器端和客户端能够正常进行网络通信,故而程序也分为服务器端和客户端两部分;
a. 使用 UDP 协议进行网络通信
i. 服务器端
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class ServerTest {
public static void main(String[] args) {
DatagramSocket socket = null;
DatagramPacket packet_send = null;
DatagramPacket packet_receive = null;
int port = 5151;
try {
socket = new DatagramSocket(port);
System.out.println("服务器启动!");
byte[] r = new byte[1024];
packet_receive = new DatagramPacket(r, r.length);
socket.receive(packet_receive);
InetAddress client_ip = packet_receive.getAddress();
int client_port = packet_receive.getPort();
byte[] data = packet_receive.getData();
int len = packet_receive.getLength();
String str1 = new String(data, 0, len);
System.out.println("客户机" + client_ip + ":" + client_port + "\n 发送的信息是:" + str1);
String response = "Hello,I am Server B";
byte[] s = response.getBytes();
packet_send = new DatagramPacket(s, s.length, client_ip, client_port);
socket.send(packet_send);
} catch (Exception e) {
System.out.println(e);
} finally {
socket.close();
}
}
}
ii. 客户端
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class ClientTest {
public static void main(String[] args) {
DatagramSocket socket = null;
DatagramPacket packet_send = null;
DatagramPacket packet_receive = null;
String server = "127.0.0.1";
int port = 5151;
String str = "Hello,I am Client A";
byte[] data = str.getBytes();
try {
socket = new DatagramSocket();
InetAddress addr = InetAddress.getByName(server);
packet_send = new DatagramPacket(data, data.length, addr, port);
socket.send(packet_send);
byte[] r = new byte[1024];
packet_receive = new DatagramPacket(r, r.length);
socket.receive(packet_receive);
byte[] response = packet_receive.getData();
int len = packet_receive.getLength();
String str1 = new String(response, 0, len);
System.out.println("服务器响应的信息是:" + str1);
} catch (Exception e) {
System.out.println(e);
} finally {
socket.close();
}
}
}
iii. 运行演示