UDP简介
TCP的所有操作都必须建立可靠的连接,这样肯定会消耗大量的系统资源,为了减少这种开销,在网络中又提供了另一种传输协议—UDP协议,DUP连接时一种不可靠的连接,UDP协议广泛的使用与各种聊天工具中。
使用DUP发送的消息,接收方不一定会接收到,所有的信息使用数据包的形式发送出去,所以这就要求客户端要始终等待服务器发送的消息才能进行接收,在Java中使用DatagramSocket类和DatagramPacket类完成UDP程序的开发。
UDP程序实现
在UDP开发中使用DatagramPacket类包装一条要发送的信息,之后使用DatagramSocket类用于完成信息的发送操作,这两个类的常用方法如下表所示。
| 序号 |
DatagramPacket类常用方法 |
描述 |
| 1 |
DatagramPacket(byte[] buf, int length) |
构造 DatagramPacket(数据报包)对象,指定数据报包的长度为length |
| 2 |
DatagramPacket(byte[] buf, int length, InetAddress address, int port) |
构造数据报包对象,指定数据的长度,目标地址,目标端口 |
| 3 |
byte[] getData() |
返回接收的数据 |
| 4 |
int getLength() |
返回将要发送或接收到的数据的长度。 |
| 序号 |
DatagramSocket类的常用方法 |
描述 |
| 1 |
DatagramSocket(int port) |
创建数据报套接字并将其绑定到本地主机上的指定端口。 |
| 2 |
void send(DatagramPacket p) |
从此套接字发送数据报包。 |
| 3 |
void receive(DatagramPacket p) |
从此套接字接收数据报包。 |
实现UDP程序,首先应该从客户端编写,在客户端指定要接收数据的端口和取得数据。
实例:UDP客户端—UDPClient
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| package my.net.udp;
import java.net.DatagramPacket; import java.net.DatagramSocket;
public class UDPClient { public static void main(String args[]) throws Exception { DatagramSocket ds = null; byte[] buf = new byte[1024]; DatagramPacket dp = null; ds = new DatagramSocket(6666); dp = new DatagramPacket(buf, 1024); System.out.println("等待接收信息中..."); ds.receive(dp); String receiveStr= new String(dp.getData(), 0, dp.getLength()); String str=receiveStr + "from " + dp.getAddress().getHostAddress() + ":" + dp.getPort(); System.out.println("接收到信息:"); System.out.println(str); } }
|
程序运行结果:
![UDP客户端运行结果]()
程序运行之后,客户端已经打开了监听端口,等待服务器端向客户端发送信息。现在来编写服务端向客户端接收信息。
实例:DUP发送的服务端程序—UDPServer
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| package my.net.udp;
import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress;
public class UDPServer { public static void main(String args[]) throws Exception { DatagramSocket ds = null; DatagramPacket dp = null; ds = new DatagramSocket(8888); String str = "来着服务器的消息"; byte[] tosend=str.getBytes(); dp = new DatagramPacket(tosend, tosend.length, InetAddress.getByName("localhost"), 6666); System.out.println("服务器正在发送信息..."); ds.send(dp); System.out.println("发送完毕..."); ds.close(); } }
|
运行结果:
![DUP客户端的运行结果]()
在服务器端运行完成后,客户端可以接收到来自服务端的消息,此时的客户端的运行结果:
![客户端接收到的消息]()