zoukankan      html  css  js  c++  java
  • java UDP通信

    一 DatagramPacket

      UDP是一种面向无连接的协议,因此,在通信时发送端和接收端不用建立连接。UDP通信的过程就像是货

    运公司在两个码头间发送货物一样。在码头发送和接收货物时都需要使用集装箱来装载货物,UDP通信也是一样

    ,发送和接收的数据也需要使用“集装箱”进行打包,为此JDK中提供了一个DatagramPacket类,该类的实例对象

    就相当于一个集装箱,用于封装UDP通信中发送或者接收的数据。

      想要创建一个DatagramPacket对象,首先需要了解一下它的构造方法。在创建发送端和接收端的DatagramPacket

    对象时,使用的构造方法有所不同,接收端的构造方法只需要接收一个字节数组来存放接收到的数据,而发送端的构

    造方法不但要接收存放了发送数据的字节数组,还需要指定发送端IP地址和端口号。

      使用该构造方法在创建DatagramPacket对象时,指定了封装数据的字节数组和数据的大小,没有指定IP地址和端口

    号。很明显,这样的对象只能用于接收端,不能用于发送端。因为发送端一定要明确指出数据的目的地(ip地址和端口号)

    而接收端不需要明确知道数据的来源,只需要接收到数据即可。

      使用该构造方法在创建DatagramPacket对象时,不仅指定了封装数据的字节数组和数据的大小,还指定了数据包的目

    IP地址(addr)和端口号(port)。该对象通常用于发送端,因为在发送数据时必须指定接收端的IP地址和端口号,就好

    像发送货物的集装箱上面必须标明接收人的地址一样。

     二 DatagramSocket

      DatagramPacket数据包的作用就如同是“集装箱”,可以将发送端或者接收端的数据封装起来。然而运输货物只有

    “集装箱”是不够的,还需要有码头。在程序中需要实现通信只有DatagramPacket数据包也同样不行,为此JDK中提供的

    一个DatagramSocket类。DatagramSocket类的作用就类似于码头,使用这个类的实例对象就可以发送和接收DatagramPacket

    数据包,发送数据的过程如下图所示。

      在创建发送端和接收端的DatagramSocket对象时,使用的构造方法也有所不同,下面是DatagramSocket类中常用的构造方法。

      该构造方法用于创建发送端的DatagramSocket对象,在创建DatagramSocket对象时,并没有指定端口号,此时,系统会分配

    一个没有被其它网络程序所使用的端口号。

      该构造方法既可用于创建接收端的DatagramSocket对象,又可以创建发送端的DatagramSocket对象,在创建接收端的DatagramSocket

    对象时,必须要指定一个端口号,这样就可以监听指定的端口。

    三 UDP网络程序

    下图为UDP发送端与接收端交互图解

      要实现UDP通信需要创建一个发送端程序和一个接收端程序,很明显,在通信时只有接收端程序先运行,才能避免因

    发送端发送的数据无法接收,而造成数据丢失。因此,首先需要来完成接收端程序的编写。

    UDP完成数据的发送

    /*
    * 发送端
     * 1,创建DatagramPacket对象,封装数据,接收的地址和端口
     * 2,创建DatagramSocket对象
    * 3,调用DatagramSocket中的send方法,发送数据包
     * 4,关闭资源DatagramSocket
     */
    public class UDPSend {
        public static void main(String[] args) throws IOException {
            //1,创建DatagramSocket对象
            DatagramSocket sendSocket = new DatagramSocket();
            //2,创建DatagramPacket对象,并封装数据
            //public DatagramPacket(byte[] buf, int length, InetAddress address,  int port)
            //构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。
            byte[] buffer = "hello,UDP".getBytes();
            DatagramPacket dp = new DatagramPacket(buffer, buffer.length, InetAddress.getByName("192.168.75.58"), 12306);
            //3,发送数据
            //public void send(DatagramPacket p) 从此套接字发送数据报包
            sendSocket.send(dp);
            //4,释放流资源
            sendSocket.close();
        }
    }

    UDP完成数据的接收

    /*
     * UDP接收端
     * 
     * 1,创建DatagramSocket对象,绑定端口号(要和发送端端口号一致)
     * 2,创建字节数组,接收发来的数据
     * 3,创建数据包对象DatagramPacket
     * 4,调用DatagramSocket对象方法receive(DatagramPacket dp)接收数据,数据放在数据包中
     * 5,拆包
          发送的IP地址
              数据包对象DatagramPacket方法getAddress()获取的是发送端的IP地址对象
              返回值是InetAddress对象
          接收到的字节个数
              数据包对象DatagramPacket方法getLength()
          发送方的端口号
              数据包对象DatagramPacket方法getPort()发送端口
     * 6,关闭资源
     */
    public class UDPReceive {
        public static void main(String[] args) throws IOException {
            //1,创建DatagramSocket对象,并指定端口号
            DatagramSocket receiveSocket = new DatagramSocket(12306);
            //2,创建DatagramPacket对象, 创建一个空的仓库
            byte[] buffer = new byte[1024];
            DatagramPacket dp = new DatagramPacket(buffer, 1024);
            //3,接收数据存储到DatagramPacket对象中
            receiveSocket.receive(dp);
            //4,获取DatagramPacket对象的内容
            //谁发来的数据  getAddress()
            InetAddress ipAddress = dp.getAddress();
            String ip = ipAddress.getHostAddress();//获取到了IP地址
            //发来了什么数据  getData()
            byte[] data = dp.getData();
            //发来了多少数据 getLenth()
            int length = dp.getLength();
            //显示收到的数据
            String dataStr = new String(data,0,length);
            System.out.println("IP地址:"+ip+ "数据是"+ dataStr);
            //5,释放流资源
            receiveSocket.close();
        }
    }

     

     

     

     

  • 相关阅读:
    升级windows 11小工具
    windows 10更新升级方法
    您需要了解的有关 Oracle 数据库修补的所有信息
    Step by Step Apply Rolling PSU Patch In Oracle Database 12c RAC Environment
    Upgrade Oracle Database Manually from 12.2.0.1 to 19c
    如何应用版本更新 12.2.0.1.210420(补丁 32507738 – 2021 年 4 月 RU)
    xtrabackup 安装、备份和恢复
    Centos_Lvm expand capacity without restarting CentOS
    Centos_Lvm_Create pv vg lv and mount
    通过全备+relaylog同步恢复被drop的库或表
  • 原文地址:https://www.cnblogs.com/jiejava/p/13458365.html
Copyright © 2011-2022 走看看