一.UDP特点
效率高
不可靠
数据包/非连接
二.程序例子
服务器端:
package networkProgramming; import java.net.DatagramPacket; import java.net.DatagramSocket; /** * 一.public final class DatagramPacket extends Object该类表示数据报包。 * 数据报包用于实现无连接分组传送服务。 * 仅基于该数据包中包含的信息,每个消息从一台机器路由到另一台机器。 * 从一台机器发送到另一台机器的多个分组可能会有不同的路由, * 并且可能以任何顺序到达。 包传送不能保证。 * */ public class TestUDPServer { public static void main(String[] args) throws Exception{ byte buf[]=new byte[1024]; /* * DatagramPacket(byte[] buf, int length) * 构造一个 DatagramPacket用于接收长度的数据包 length 。 */ DatagramPacket dp=new DatagramPacket(buf, buf.length); /* * public class DatagramSocket extends Object implements Closeable * 此类表示用于发送和接收数据报数据包的套接字 */ DatagramSocket ds=new DatagramSocket(5678); while(true) { /* * public void receive(DatagramPacket p)throws IOException * 从此套接字接收数据报包。 当此方法返回时, DatagramPacket的缓冲区将填充接收到的数据。 * 数据包还包含发送者的IP地址和发件人机器上的端口号。 */ ds.receive(dp); //dp.getLength()包裹到底收了多少个数据 System.out.println(new String(buf,0,dp.getLength())); } } }
程序文字解析:在DatagramPacket dp对象是用来接收数据包的,而Byte buf是它的缓冲区,每次DatagramSocket ds接收数据的时候把数据都扔进dp数据包中
程序图解析:通过5678端口接收从客户端接收到的数据,扔进缓冲区
客户端:
package networkProgramming; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetSocketAddress; public class TestUDPClient { public static void main(String[] args) throws Exception{ //将字符串转换为字节序列 byte[]buf=(new String("hello")).getBytes(); /** * public DatagramPacket(byte[] buf,int length,SocketAddress address) * 构造用于发送长度的分组的数据报包length指定主机上到指定的端口号。 * length参数必须小于或等于buf.length 。 * 参数 buf - 数据包数据。 * length - 包长度。 * address - 目的地址。 */ //要发送的数据包,这里inetAddress是socketAddress的子类 //声明发送主机端口和服务器端口,剩下的由路由器去寻找 DatagramPacket dp=new DatagramPacket(buf,buf.length, new InetSocketAddress("127.0.0.1", 5678)); /* * DatagramSocket(int port) * 构造数据报套接字并将其绑定到本地主机上的指定端口。 */ DatagramSocket ds=new DatagramSocket(9999); //send(DatagramPacket p)从此套接字发送数据报包。 ds.send(dp); //关闭数据包套接字 ds.close(); } }
程序文字解析:把缓冲区的字符串进过转换为字节序列,然后把数据扔进数据包,要声明主机ip和要发送的目的地(5678),通过主机的9999端口发送出去
程序图解析 :
三.整个程序运行起来的原理就像下图