用户数据协议(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(); } } }
运行结果: