02_Java网络编程之UDP协议

      最后更新:2021-12-21 17:16:58 手机定位技术交流文章

      文章目录

      • 0. 概述
      • 一. 目标用于UDP通信。
        • 数据包第1号:数据包对象
        • DatagramSocket: 发件人和收件人对象
      • 二. 联合民主党发来的信息之一。
        • 步骤2:实施客户(投标)
        • 第二步:取得和实现最终结果
      • 三. 联合民主党的通信模拟器数量众多,而且受到好评。
        • 步骤3:执行发送程序
        • 第三步:取得和实现最终结果
      • 四. 得到民进联支持的三种通信形式
        • 步骤4:实现广播
        • 组群完成第四阶段。
      • 5. 实时通信

      0. 概述

      从理论上讲,由于TCP将建立一种联系,而UDP会将食物丢弃。

      因此,只有TCP区分服务器和客户客户,但UDP没有区分服务器和客户。

      UDP协议特点:

      • 联合民主党是一个互不相连和不稳定的通信系统。
      • 将数据源IP、目的IP和端口以及数据输入64KB软件包,并立即传送。

      简而言之,民主联盟的协议就像在短片中将食物扔到街对面。

      需要一个人(收到终端天体的数据套件发件人)投掷天线(数据),需要一张天线板(数据套件数据包天体)装入天线。

      一. 目标用于UDP通信。

      数据包第1号:数据包对象

      • 可以当成装菜的盘子
      • 表示数据报的数据包
      • 检查源代码, 你会注意到这个类是一个不可改变的物体, 由决赛修改 。
      • 构造器:
      构造器 说明
      public DatagramPacket(byte[] buf, int length, InetAddress address, int port) 创建发送端数据包对象,
      buf: 要传输的字节, 要发送的文本
      长度: 要传送的项目的字节数 。
      地址: 接收端的 IP 地址对象
      端口: 接收港口的端口号
      public DatagramPacket(byte[] buf, int length) 创建接收端的数据包对象buf: 存储收到的物品, 长度: 可以接收物品的最大长度
      • 常用API:
      方法 说明
      public int getLength() 接收到的字节数或要交付的数据长度要返回。
      byte[] getData() 返回数据包中的数据
      InetAddress getAddress() 返回用于发送或接收数据的计算机 IP 地址。
      如果没有指定 IP 地址, 此函数返回机器的 IP 地址 。
      SocketAddress getSocketAddress () 返回传输或接收数据报告的远程主机 Socket 地址。
      (通常使用IP地址和端口号)
      int getPort() 返回传送或接收数据的远程主机端口号,如果没有设置,则返回0。

      DatagramSocket: 发件人和收件人对象

      • 可以理解为扔菜的人
      • 发送和接收数据报告的数据报告插座
      • 已经结束了 Java. 我不确定你在说什么
      • 构造器:
      构造器 说明
      public DatagramSocket() 创建对象发送发送endSocket,系统会随机分配一个端口号
      public DatagramSocket(int port) 创建在接收端,套接字对象此外,在当地东道方上,对所提供的港口号具有约束力。
      这不是一件可怕的事情 你不得不利用这个 来制造发件人。
      • 常用API:
      方法 说明
      public void send(DatagramPacket dp) 发送数据包
      public void receive(DatagramPacket p) 接收数据包并将数据装入 p.

      二. 联合民主党发来的信息之一。

      步骤2:实施客户(投标)

      1. 现在,创建发件人 DatagramSocket 。
      2. 数据包(磁盘) 数据包(磁盘) 数据包(磁盘) 数据包(磁盘) 数据包(磁盘) 数据包(磁盘) 数据包(磁盘) 数据包(磁盘) 数据包还有对方的IP地址和港口号
      3. 使用 DatagramSocket 对象与 DatagramPacket 对象的传输方法作为参数 。
      4. 释放资源
      5. 请记住,启动发送人将报告这一问题,接收端必须首先开始。

      发送端代码示例:

      import java.net.DatagramPacket;
      import java.net.DatagramSocket;
      import java.net.InetAddress;
      import java.nio.charset.StandardCharsets;
      
      * TCP客户,UDP发件人 *
      public class SenderDemo {
          public static void main(String[] args) {
              System.out.println(呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼);
              try (
                  /然后,创建发送对象(扔食物者)。
                  DatagramSocketsocket= new DatagramSocket();
                      ){
                  / 开始建立字节阵列封装数据(类别)。
                  byte[]buffer= "我就是拒绝被扔掉的泡菜" 这是一顿可怕的饭".getBytes(StandardCharsets.UTF_8);
      
                  / 生成一个带有收件人IP地址和端口号的数据集对象(空格)。
                  DatagramPacketpacket= new DatagramPacket(buffer, buffer.length,
                          InetAddress.getLocalHost(), 8888);
      
                  // 扔菜!!!!
                  socket.send(packet);
              } catch (Exception e) {
                  e.printStackTrace();
              }
          }
      }
      

      第二步:取得和实现最终结果

      1. 制作一个收件人对象数据套件并指定端口(人)
      2. a 构建数据组包数据包对象以接收数据(磁盘),并提出以下分组大小建议:1024*64由于一个UDP数据集可能高达64kb
      3. 当线条被封住直到收到数据时, 使用数据表套件对象的读法, 将数据表包对象作为参数( 我取回您的餐) 传递给您 。
      4. 首先启动服务器(接收),然后启动客户端(招标)。
      5. 收集数据, 记下它: 尽可能多地获得测量数据( getLength () 功能与板块一起)
      6. 释放资源

      接收端代码示例:

      import java.net.DatagramPacket;
      import java.net.DatagramSocket;
      
      public class ReceiverDemo {
          public static void main(String[] args) {
              System.out.println(do -do -do -do -do -do -do -do -do -do -do -do -do -do -do -do -do -do -do -do -do -do);
              try (
                  建立接收对象(人),端口号必须与发送数据包对象的端口号相同。
                  DatagramSocketsocket= new DatagramSocket(8888);
                      ){
                  / 使软件包对象接受来自磁盘的数据。
                  byte[]bytes= new byte[1024*64];
                  DatagramPacketpacket= new DatagramPacket(bytes, bytes.length);
      
                  // 等待接收数据
                  / 一旦启用,服务器端将准备接受数据。
                  socket.receive(packet);
      
                  // 读取数据
                  Stringstr= new String(bytes, 0, packet.getLength());
                  System.out.println("收到的数据:" + str);
              } catch (Exception e) {
                  e.printStackTrace();
              }
          }
      }
      

      三. 联合民主党的通信模拟器数量众多,而且受到好评。

      多发多收:

      • 信件总是由发件人发送。
      • 接收者可以不断接收许多发件人发来的信息。
      • 当发送者进入出口或其他终端信息时,发送者即告结束。

      步骤3:执行发送程序

      1. 制作发件人数据套。
      2. 使用while死循环如果您想要持续获得数据输入,输入退出时退出程序 。(可以使用IO流)
      3. 如果输入不退出, 数据包( 磁盘) 将数据包包( 磁盘) 。输入收件人的 IP 地址和端口号 。
      4. 使用 DatagramSocket 对象发送方法( 编织) 传输软件包对象 。
      5. 释放资源

      示例:

      import java.net.DatagramPacket;
      import java.net.DatagramSocket;
      import java.net.InetAddress;
      import java.nio.charset.StandardCharsets;
      import java.util.Scanner;
      
      * TCP客户,UDP发件人 *
      public class SenderDemo {
          public static void main(String[] args) {
              System.out.println(呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼);
              try (
                  /然后,创建发送对象(扔食物者)。
                  DatagramSocketsocket= new DatagramSocket();
                      ){
                  Scannerin= new Scanner(System.in);
                  做一个死循环, 读取数据无限期 直到你读取退出。
                  while (true) {
                      System.out.println(“请输入发件人姓名:”);
                      Stringstr= in.nextLine();
      
                      /作为出路的裁判
                      if ("exit".equals(str)){
                          System.out.println("再见,别打电话了");
                          break;
                      }
      
                      / 开始建立字节阵列封装数据(类别)。
                      byte[]buffer= str.getBytes(StandardCharsets.UTF_8);
      
                      / 生成一个带有收件人IP地址和端口号的数据集对象(空格)。
                      DatagramPacketpacket= new DatagramPacket(buffer, buffer.length,
                              InetAddress.getLocalHost(), 8888);
      
                      // 扔菜!!!!
                      socket.send(packet);
                  }
              } catch (Exception e) {
                  e.printStackTrace();
              }
          }
      }
      

      第三步:取得和实现最终结果

      1. 制作一个收件人对象数据套件并指定端口(扔菜的人)
      2. 要接收数据( diner), 请创建数据包对象 Datagram Packet, 其数组大小如下 :1024*64
      3. 第4步应利用整个生命周期来实施。
      4. 输入数据组包件对象,使用数据组包件对象的重新定位方法(烹饪)输入数据组包件对象。

      注意:

      • 因为UDP不需要连接, 接收端只负责接收当前的数据包 。发件人的包裹涉及哪些包裹是没有区别的。
      • 因此UDP接收器可以从发送者接收大量信息。
      • TCP还必须使用几条线索接收大量发送端信息,因为TCP必须建立连接。

      示例:

      import java.net.DatagramPacket;
      import java.net.DatagramSocket;
      
      public class ReceiverDemo {
          public static void main(String[] args) {
              System.out.println(do -do -do -do -do -do -do -do -do -do -do -do -do -do -do -do -do -do -do -do -do -do);
              try (
                  建立接收对象(人),端口号必须与发送数据包对象的端口号相同。
                  DatagramSocketsocket= new DatagramSocket(8888);
                      ){
                  / 使软件包对象接受来自磁盘的数据。
                  byte[]bytes= new byte[1024*64];
                  DatagramPacketpacket= new DatagramPacket(bytes, bytes.length);
      
                  / 连续数据接收的书写循环
                  while (true) {
                      // 等待接收数据
                      / 一旦启用,服务器端将准备接受数据。
                      socket.receive(packet);
      
                      // 读取数据
                      Stringstr= new String(bytes, 0, packet.getLength());
                      System.out.println("收到了来自" + packet.getAddress() + "相反的数据端口是:"
                              + packet.getPort() + ",数据为:" + str);
                  }
              } catch (Exception e) {
                  e.printStackTrace();
              }
          }
      }
      

      四. 得到民进联支持的三种通信形式

      • 无线电通信:一个主机与一个主机之间的通信。一切都在单机上。
      • 广播: 当前的主机连接到网络的所有主机 。
      • Groupcast:当前主机与所选主机组的联系可能被视为是针对向感兴趣的个人发送推文的东道主组的IP跟踪 IP 。

      步骤4:实现广播

      • 使用广播地址:确定额外端口,其他主机(包括主机)分配给同一网络段的主机。

      • 具体步骤:

        发送者数据包的目的地是一个广播地址,有明确的港口。 (,88)
        只有网络中的其他主机注册相关港口,他们才能获得信息。 (88)

        例如,网络部分。第一个IP地址中有三个位于同一区域。

      • 只需更改发件人源代码, 例如 :

      import java.net.DatagramPacket;
      import java.net.DatagramSocket;
      import java.net.InetAddress;
      import java.nio.charset.StandardCharsets;
      import java.util.Scanner;
      
      * TCP客户,UDP发件人 *
      public class SenderDemo {
          public static void main(String[] args) {
              System.out.println(呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼);
              try (
                  /然后,创建发送对象(扔食物者)。
                  DatagramSocketsocket= new DatagramSocket();
                      ){
                  Scannerin= new Scanner(System.in);
                  做一个死循环, 读取数据无限期 直到你读取退出。
                  while (true) {
                      System.out.println(“请输入发件人姓名:”);
                      Stringstr= in.nextLine();
      
                      /作为出路的裁判
                      if ("exit".equals(str)){
                          System.out.println("再见,别打电话了");
                          break;
                      }
      
                      / 开始建立字节阵列封装数据(类别)。
                      byte[]buffer= str.getBytes(StandardCharsets.UTF_8);
      
                      / 生成一个带有收件人IP地址和端口号的数据集对象(空格)。
                      记得用收音机 更改IP地址
                      DatagramPacketpacket= new DatagramPacket(buffer, buffer.length,
                              InetAddress.getByName("255.255.255.255"), 8888);
      
                      // 扔菜!!!!
                      socket.send(packet);
                  }
              } catch (Exception e) {
                  e.printStackTrace();
              }
          }
      }
      

      组群完成第四阶段。

      • 虽然保留了地址,但使用该地址是不可接受的。

      • 发件人为集体广播地址(例如:)选择IP地址以及端口号

      • 要玩 IP, 接收者必须约束组 。(a) 接收端有登记发件人提供的港号,以便接收集团电文。

      • 该组必须在接收端播放 IP :

        MulticastSocket, 数据组子类, 可在接收端播放 IP 。

        因此,在建造接收对象时, 利用他的儿子多播片套。

        他的孩子是大师的教官 厨师比他父亲还大

        joinGroup.netAddress.com. GetByName (“播放 IP ”) = 连接该组播放 IP 的方法 。

        然而,这个函数首次出现在JDK14..

        示例:

      MulticastSocketsocket= new MulticastSocket(8888);
      socket.joinGroup(InetAddress.getByName("224.1.1.1"));
      
      • 不过时的方法:

        joinGroup(SocketAddress mcastaddr, NetworkInterface netIf);
        SocketAddress 是第一个参数, 可以通过下列方式获得 :
        new InetSocketAddress(InetAddress.getByName("224.1.1.1"), 8888);
        / 参数2是一个网络段,有指定的接收端,可以接收同一节主机发来的信息。
        我们经常使用当前主机所在的默认部分(通常是局域网):
        NetworkInterface.getByInetAddress(InetAddress.getLocalHost();
        

      因此,不仅必须编辑发报机的源代码,而且必须编辑接收端的源代码。

      发送源代码以重写 IP 分布将会是有效的, 只要发件人步骤转换为广播模式, 并且没有演示文稿 。

      接收端代码示例:

      import java.net在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/15165.html

          热门文章

          文章分类