用户数据协议(UDP)是网络信息传输的另外一种形式, 基于UDP的通信不同于基于TCP的通信, 基于UDP的信息传递更快, 但是不提供可靠的保证. 使用UDP传输数据时, 用户无法知道数据能否正确地到达主机, 也不能确定到达目的地的顺序是否和发送的顺序相同. 虽然, UDP是一种不可靠的协议, 但如果需要较快地传输信息, 并能够容忍较小的错误, 可以考虑使用UDP.
基于UDP通信的基本模式如下:
1. 将数据打包(称为数据包), 然后将数据包发往目的地.
2. 接收别人发来的数据包, 然后查看数据包.
UDP程序步骤:
发送数据包:
1. 使用 DatagramSocket()创建一个数据包套接字.
2. 使用 DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)创建要发送的数据包.
3. 使用 DatagramSocket类的 send()方法发送数据包.
接收数据包:
1. 使用 DatagramSocket(int port)创建数据包套接字, 绑定到指定端口.
2. 使用 DatagramPacket(byte[] buf, int length)创建字节数组来接收数据包.
3. 使用 DatagramPacket类的 receive()方法接收UDP包.
Demo_1:
Server 端:
import java.io.IOException;
import java.net.*;
public class TestUDPServer {
public static void main(String[] args) {
byte buf[] = new byte[1024];
try {
DatagramSocket ds = new DatagramSocket(5678);
DatagramPacket dp = new DatagramPacket(buf, buf.length);
while(true){
try {
ds.receive(dp);
System.out.println(new String(buf,0,dp.getLength()));
} catch (IOException e) {
e.printStackTrace();
}
}
} catch (SocketException e) {
e.printStackTrace();
}
}
}
Client 端:
import java.io.IOException;
import java.net.*;
public class TestUDPClient {
public static void main(String[] args) {
byte[] buf = (new String("hello java")).getBytes();
DatagramPacket dp = new DatagramPacket(buf, buf.length, new InetSocketAddress("192.168.56.1", 5678));
DatagramSocket ds;
try {
ds = new DatagramSocket(9999);
try {
ds.send(dp);
} catch (IOException e) {
e.printStackTrace();
}
ds.close();
} catch (SocketException e) {
e.printStackTrace();
}
}
}
运行结果:
Demo_2:
Server 端:
import java.io.*;
import java.net.*;
public class UDPServer {
public static void main(String[] args) {
byte[] buf = new byte[1028];
try {
DatagramSocket ds = new DatagramSocket(5679);
DatagramPacket dp = new DatagramPacket(buf, buf.length);
while(true){
try {
ds.receive(dp);
ByteArrayInputStream bais = new ByteArrayInputStream(buf);
DataInputStream dis = new DataInputStream(bais);
System.out.println(dis.readLong());
} catch (IOException e) {
e.printStackTrace();
}
}
} catch (SocketException e) {
e.printStackTrace();
}
}
}
Client 端:
import java.io.*;
import java.net.*;
public class UDPClient {
public static void main(String[] args) {
long n = 1089L;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
try {
dos.writeLong(n);
byte[] buf = baos.toByteArray();
DatagramPacket dp = new DatagramPacket(buf, buf.length, new InetSocketAddress("192.168.56.1", 5679));
DatagramSocket ds = new DatagramSocket(9987);
ds.send(dp);
ds.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行结果: