0
点赞
收藏
分享

微信扫一扫

用户数据报协议 UDP

Villagers 2022-02-25 阅读 78

UDP

User Datagram Protocol

文章目录


Tips

  1. DatagramSocketDatagramPacket 实现了基于 UDP 协议网络程序

与 TCP 区别

TCPUDP
使用前,须建立TCP连接,形成传输数据通道将数据、源、目的封装成数据包,不需要建立连接
传输前“三次握手”,点对点通信
可靠的
发送 / 接收方 都不确认
不可靠的
在连接中可进行大数据量的传输每个数据报的大小限制在64K
进行通信的两个应用进程:客户端、服务端。可以广播发送
传输完毕,需释放已建立的连接
效率低
发送数据结束时无需释放资源
开销小,速度快

无需建立连接原因:DatagramPacket 对象封装了UDP数据包,在数据包中包含了完整的地址信息
         即发送端的IP 地址和端口号以及接收端的IP地址和端口号
         因此无须建立发送方和接收方的连接。如同发快递包裹一样

实例化

DatagramSocket 类

  1. DatagramSocket(int port):创建数据包套接字并将其绑定到本地主机上的指定端口
                 套接字将被绑定到通配符地址,IP 地址由内核来选择。
  2. DatagramSocket(int port,InetAddress laddr):创建数据包套接字,将其绑定到指定的本地地址。
        本地端口必须处于 [0 ,65535]
        如果 IP 地址为 0.0.0.0,套接字将被绑定到通配符地址,IP 地址由内核选择。

DatagramPacket类

  1. DatagramPacket(byte[] buf,int length):构造 DatagramPacket,用来接收长度为 length 的数据包。 length ≤ buf.length
  2. DatagramPacket(byte[] buf,int length,InetAddress address,int port):构造数据包,用来将长度为 length 的包发送到指定主机上的指定端口号。length ≤ buf.length

发送端

	public void sender() throws IOException {
        DatagramSocket socket = new DatagramSocket();
        String str = "我是UDP方式发送的导弹";
        byte[] data = str.getBytes();
        InetAddress inet = InetAddress.getLocalHost();
        //数据打包
        DatagramPacket packet = new DatagramPacket(data,0,data.length,inet,9090);
        //发送
        socket.send(packet);
        //关闭

接收端

	public void receiver() throws IOException {
        DatagramSocket socket = new DatagramSocket(9090);
        byte[] buffer = new byte[100];
        //数据打包
        DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);
        //发送
        socket.receive(packet);
        System.out.println(new String(packet.getData(),0,packet.getLength()));
        //关闭
        socket.close();
    }

常用方法

DatagramSocket 类

  1. void close():关闭此数据包套接字。
  2. void send(DatagramPacket p):从此套接字发送数据包。
    包含的信息:将要发送的数据、其长度、远程主机的IP 和端口号。
  3. void receive(DatagramPacket p):从此套接字接收数据包。
    当此方法返回时,DatagramPacket 的缓冲区填充了接收的数据,数据包也包含发送方的 IP 和端口号。
    此方法在接收到数据包前一直阻塞。
    如果信息比包的长度长,该信息将被截短。
  4. InetAddress getLocalAddress():获取套接字绑定的本地地址。
  5. int getLocalPort():返回此套接字绑定的本地主机上的端口号。
  6. InetAddress getInetAddress():返回此套接字连接的地址。如果未连接,则返回null。
  7. int getPort():返回此套接字的端口。如果未连接,则返回-1。

DatagramPacket类

  1. InetAddress getAddress():返回某台机器的 IP 地址,此数据包将要发往该机器或者是从该机器接收到的。
  2. int getPort():返回某台远程主机的端口号,此数据包将要发往该主机或者是从该主机接收到的。
  3. byte[] getData():返回数据缓冲区。接收到的或将要发送的数据从缓冲区中的偏移量 offset 处开始,持续 length 长度。
  4. int getLength():返回将要发送或接收到的数据的长度。
举报

相关推荐

用户数据报协议UDP

0 条评论