UDP编程系列一

一.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端口发送出去

程序图解析 :


三.整个程序运行起来的原理就像下图

原文地址:https://www.cnblogs.com/zjm1999/p/10243387.html