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

    程序图解析 :


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

  • 相关阅读:
    贪婪匹配
    洛谷P1219 [USACO1.5]八皇后 Checker Challenge【搜索回溯】
    【数据结构笔记】栈
    数据结构课堂笔记
    DAY1
    小记2020.1.10
    c++复习
    c++用流控制成员函数输出数据
    c++用控制符控制输出格式
    "中国东信杯"广西大学第二届程序设计竞赛E Antinomy与红玉海(二分)
  • 原文地址:https://www.cnblogs.com/zjm1999/p/10243387.html
Copyright © 2020-2023  润新知