JAVA Socket实现UDP编程(非常详细,附带实例)
在网络编程中,套接字(Socket)为网络上两台计算机之间的通信提供了一种机制。
两台计算机之间的通信通过套接字创建一条通信信道,程序员使用这条通信信道在两台计算机之间发送数据。在客户机/服务器工作模式下,将端口号与 IP 地址的组合称为网络套接字。
Java 中的套接字分为 TCP 套接字(由 Socket 类实现)和 UDP 套接字(由 DatagramSocket 类实现)两种形式。在客户机/服务器工作模式下,每个 Socket 可以进行读和写两种操作。本节重点讲解 UDP 套接字。
Socket 通信模型如下图所示:

图 1 Socket通信模型
由图 1 可知,Socket 通信分为 4 个步骤:
DatagramSocket 类的构造方法如下:
DatagramSocket 类常用的方法如下。
DatagramPacket 类的构造方法如下:
DatagramPacket 类常用的方法如下:
【实例】循环从键盘上输入字符串并发送到本地主机的 1000 端口上,直到输入“exit”结束。
【实例】循环接收发送到本地主机 1000 端口上的数据,直到收到“exit”结束。
两台计算机之间的通信通过套接字创建一条通信信道,程序员使用这条通信信道在两台计算机之间发送数据。在客户机/服务器工作模式下,将端口号与 IP 地址的组合称为网络套接字。
Java 中的套接字分为 TCP 套接字(由 Socket 类实现)和 UDP 套接字(由 DatagramSocket 类实现)两种形式。在客户机/服务器工作模式下,每个 Socket 可以进行读和写两种操作。本节重点讲解 UDP 套接字。
Socket 通信模型如下图所示:

图 1 Socket通信模型
由图 1 可知,Socket 通信分为 4 个步骤:
- 创建 ServerSocket 和 Socket;
- 打开连接 Socket的输入/输出流;
- 按照协议对 Socket 执行读/写操作;
- 关闭输入/输出流和 Socket。
Java DatagramSocket类
java.net 包中的 DatagramSocket 类用于发送和接收数据报的套接字,即 UDP Socket。DatagramSocket类是数据报传递服务的发送点或接收点。在 DatagramSocket 上发送或接收的每个数据报包(Datagram Packet)都被单独寻址和路由。从一台机器发送到另一台机器的多个数据报包可能会以不同的方式路由,并且可能以任何顺序到达。DatagramSocket 类的构造方法如下:
- DatagramSocket():创建一个 UDP 数据报套接字的 Socket,并绑定到本地主机的任意一个端口上(一般用于客户端)。
- DatagramSocket(int port):创建一个 UDP 数据报套接字的 Socket,并绑定到本地主机的指定端口上(一般用于服务器端)。
DatagramSocket 类常用的方法如下。
- void receive(DatagramPacket p):从此套接字接收数据包(如果没有接收到数据包,那么该方法会阻塞等待)。
- void send(DatagramPacket p):从此套接字发送数据包(不会阻塞等待,直接发送)。
- void close():关闭此 DatagramSocket。
Java DatagramPacket类
java.net 包中的 DatagramPacket 类用来表示数据报包,数据报包用来实现无连接包投递服务。每条报文仅根据该包中包含的信息从一台机器路由到另一台机器。DatagramPacket 类的构造方法如下:
- DatagramPacket(byte[] buf, int length):构造 DatagramPacket 类,用来接收长度为 length 的数据包,length 必须小于或等于缓存数组 buf 的长度。
- DatagramPacket(byte[] buf, int offset, int length):构造 DatagramPacket 类,用来接收长度为 length 的数据包,并指定了缓存区中的偏移量。
- DatagramPacket(byte[] buf, int length, InetAddress address, int port):构造 DatagramPacket 类,用来将长度为 length 的数据包发送到指定主机的指定端口上。
- DatagramPacket(byte[] buf, int length, SocketAddress address):构造 DatagramPacket 类,用来将长度为 length 的数据包发送到指定主机的指定端口上。
DatagramPacket 类常用的方法如下:
- InetAddress getAddress():返回某台机器的 IP 地址,此数据包将要发往该机器或从该机器接收。
- byte[] getData():返回数据缓存区。
- int getLength():返回将要发送或接收的数据的长度。
- int getOffset():返回将要发送或接收的数据的偏移量。
- int getPort():返回某台远程主机的端口号,此数据包将要发往该主机或从该主机接收。
- void setAddress(InetAddress addr):设置要将此数据包发往的目的机器的 IP 地址。
- void setData(byte[] buf, int offset, int length):为此数据包设置数据缓存区。
- void setPort(int port):设置要将此数据包发往的远程主机的端口号。
【实例】循环从键盘上输入字符串并发送到本地主机的 1000 端口上,直到输入“exit”结束。
import java.net.*; import java.util.Scanner; public class UDPSendDemo { public static void main(String[] args) throws Exception { DatagramSocket ds = new DatagramSocket(); Scanner sc = new Scanner(System.in); System.out.println("请输入要发送到本地主机1000端口上的数据:"); String str = sc.nextLine(); DatagramPacket dp = null; while (!str.equals("exit")) { dp = new DatagramPacket(str.getBytes(), str.getBytes().length, InetAddress.getByName("localhost"), 1000); ds.send(dp); System.out.println("请输入要发送到本地主机1000端口上的数据:"); str = sc.nextLine(); } ds.close(); } }运行结果为:
请输入要发送到本地主机1000端口上的数据:hello
请输入要发送到本地主机1000端口上的数据:welcome
请输入要发送到本地主机1000端口上的数据:you
请输入要发送到本地主机1000端口上的数据:exit
【实例】循环接收发送到本地主机 1000 端口上的数据,直到收到“exit”结束。
import java.net.*; public class UDPReceiveDemo { public static void main(String[] args) throws Exception { DatagramSocket ds = new DatagramSocket(1000); byte[] buf = new byte [1024]; // 构建长度为 1024 的缓存区,用于接收数据 DatagramPacket dp = new DatagramPacket(buf,buf.length); while ( true ){ ds.receive(dp); String s = new String(dp.getData(), 0, dp.getLength()); System.out.printf("从%s: %d 接收的数据:%s\n", dp.getAddress().getHostAddress(), dp.getPort(),s); if (s.equals("exit")){ break; } } } }