当前位置:首页 > 物联网 > 物联网技术文库
[导读]   在进行UDP协议的使用中,我们通常会借助其他语言工具来完成工作。那么今天我们主要介绍一下Java下的UDP协议的使用。首先我们来了解一下UDP协议的基本概念。UDP协议的全称是用户数据报,在

  在进行UDP协议的使用中,我们通常会借助其他语言工具来完成工作。那么今天我们主要介绍一下Java下的UDP协议的使用。首先我们来了解一下UDP协议的基本概念。UDP协议的全称是用户数据报,在网络中它与TCP协议一样用于处理数据包。在OSI模型中,在第四层??传输层,处于IP协议的上一层。UDP有不提供数据报分组、组装和不能对数据包的排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。

  为什么要使用UDP

  在选择使用协议的时候,选择UDP必须要谨慎。在网络质量令人不十分满意的环境下,UDP协议数据包丢失会比较严重。但是由于UDP的特性:它不属于连接型协议,因而具有资源消耗小,处理速度快的优点,所以通常音频、视频和普通数据在传送时使用UDP较多,因为它们即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。比如我们聊天用的ICQ和OICQ就是使用的UDP协议。

  一、使用DatagramSocket发送、接收数据原理

  Java使用DatagramSocket代表UDP协议的Socket,DatagramSocket本身只是码头,不维护状态,不能产生IO流,它的唯一作用就是接收和发送数据报,Java使用DatagramPacket来代表数据报,DatagramSocket接收和发送的数据都是通过DatagramPacket对象完成的。

  1. DatagramSocket的构造器

  DatagramSocket():创建一个DatagramSocket实例,并将该对象绑定到本机默认IP地址、本机所有可用端口中随机选择的某个端口。

  DatagramSocket(int prot):创建一个DatagramSocket实例,并将该对象绑定到本机默认IP地址、指定端口。

  DatagramSocket(int port, InetAddress laddr):创建一个DatagramSocket实例,并将该对象绑定到指定IP地址、指定端口。

  通过上面三个构造器中的任意一个构造器即可创建一个DatagramSocket实例,通常在创建服务器时,创建指定端口的DatagramSocket实例--这样保证其他客户端可以将数据发送到该服务器。一旦得到了DatagramSocket实例之后,就可以通过如下两个方法来接收和发送数据。

  receive(DatagramPacket p):从该DatagramSocket中接收数据报。

  send(DatagramPacket p):以该DatagramSocket对象向外发送数据报。

  从上面两个方法可以看出,使用DatagramSocket发送数据报时,DatagramSocket并不知道将该数据报发送到哪里,而是由DatagramPacket自身决定数据报的目的地。就像码头并不知道每个集装箱的目的地,码头只是将这些集装箱发送出去,而集装箱本身包含了该集装箱的目的地。

  2. DatagramPacket的构造器

  DatagramPacket(byte[] buf,int length):以一个空数组来创建DatagramPacket对象,该对象的作用是接收DatagramSocket中的数据。

  DatagramPacket(byte[] buf, int length, InetAddress addr, int port):以一个包含数据的数组来创建DatagramPacket对象,创建该DatagramPacket对象时还指定了IP地址和端口--这就决定了该数据报的目的地。

  DatagramPacket(byte[] buf, int offset, int length):以一个空数组来创建DatagramPacket对象,并指定接收到的数据放入buf数组中时从offset开始,最多放length个字节。

  DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port):创建一个用于发送的DatagramPacket对象,指定发送buf数组中从offset开始,总共length个字节。

  当Client/Server程序使用UDP协议时,实际上并没有明显的服务器端和客户端,因为两方都需要先建立一个DatagramSocket对象,用来接收或发送数据报,然后使用DatagramPacket对象作为传输数据的载体。通常固定IP地址、固定端口的DatagramSocket对象所在的程序被称为服务器,因为该DatagramSocket可以主动接收客户端数据。

  在接收数据之前,应该采用上面的第一个或第三个构造器生成一个DatagramPacket对象,给出接收数据的字节数组及其长度。然后调用DatagramSocket 的receive()方法等待数据报的到来,receive()将一直等待(该方法会阻塞调用该方法的线程),直到收到一个数据报为止。
 

        如下代码所示:

  // 创建一个接收数据的DatagramPacket对象

  DatagramPacket packet=new DatagramPacket(buf, 256);

  // 接收数据报

  socket.receive(packet);

  在发送数据之前,调用第二个或第四个构造器创建DatagramPacket对象,此时的字节数组里存放了想发送的数据。除此之外,还要给出完整的目的地址,包括IP地址和端口号。发送数据是通过DatagramSocket的send()方法实现的,send()方法根据数据报的目的地址来寻径以传送数据报。如下代码所示:

  // 创建一个发送数据的DatagramPacket对象

  DatagramPacket packet = new DatagramPacket(buf, length, address, port);

  // 发送数据报

  socket.send(packet);

  使用DatagramPacket接收数据时,会感觉DatagramPacket设计得过于烦琐。开发者只关心该DatagramPacket能放多少数据,而DatagramPacket是否采用字节数组来存储数据完全不想关心。但Java要求创建接收数据用的DatagramPacket时,必须传入一个空的字节数组,该数组的长度决定了该DatagramPacket能放多少数据,这实际上暴露了DatagramPacket的实现细节。接着DatagramPacket又提供了一个getData()方法,该方法又可以返回Datagram Packet对象里封装的字节数组,该方法更显得有些多余--如果程序需要获取DatagramPacket里封装的字节数组,直接访问传给 DatagramPacket构造器的字节数组实参即可,无须调用该方法。

  当服务器端(也可以是客户端)接收到一个DatagramPacket对象后,如果想向该数据报的发送者“反馈”一些信息,但由于UDP协议是面向非连接的,所以接收者并不知道每个数据报由谁发送过来,但程序可以调用DatagramPacket的如下3个方法来获取发送者的IP地址和端口。

  InetAddress getAddress():当程序准备发送此数据报时,该方法返回此数据报的目标机器的IP地址;当程序刚接收到一个数据报时,该方法返回该数据报的发送主机的IP地址。

  int getPort():当程序准备发送此数据报时,该方法返回此数据报的目标机器的端口;当程序刚接收到一个数据报时,该方法返回该数据报的发送主机的端口。

  SocketAddress getSocketAddress():当程序准备发送此数据报时,该方法返回此数据报的目标SocketAddress;当程序刚接收到一个数据报时,该方法返回该数据报的发送主机的SocketAddress。getSocketAddress()方法的返回值是一个SocketAddress对象,该对象实际上就是一个IP地址和一个端口号。也就是说,SocketAddress对象封装了一个InetAddress对象和一个代表端口的整数,所以使用SocketAddress对象可以同时代表IP地址和端口。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

Qorvo 畅谈 Wi-Fi 7、BMS 及 Sensor Fusion 的革新之力

关键字: Wi-Fi 7 BMS 物联网

物联网(Internet of Things, IoT)作为一种新兴的信息技术体系,正在以前所未有的速度渗透到各个行业和社会生活的方方面面。物联网概念的提出与发展,标志着人类步入了一个全新的数字化时代,它将实体世界与虚拟...

关键字: 物联网 IoT

本文中,小编将对语音识别技术予以介绍,如果你想对它的详细情况有所认识,或者想要增进对它的了解程度,不妨请看以下内容哦。

关键字: 语音识别 智能家居 物联网

提供业界最高容量的闪存、RAM和GPIO组合,支持Matter over Thread

关键字: 闪存 RAM 物联网

拓展服务提升客户的工业无线设计能力,加快测试周期,简化生产过程

关键字: 物联网 无线设计

【2024年4月10日,德国慕尼黑和美国加利福尼亚州旧金山讯】全球功率系统和物联网领域的半导体领导者英飞凌科技股份公司(FSE代码:IFX / OTCQX代码:IFNNY)宣布其OPTIGA™ Trust M安全控制器现...

关键字: 物联网 控制器 供应链

RECOM 推出一款全新集成的隔离型DC/DC 转换器 RxxC1TF,为功率密度、成本控制和性能树立了新的标准,该转换器采用 12 焊盘 LGA 表面贴装封装,尺寸仅为 5 x 4 x 1.18 mm,并提供完全稳压的...

关键字: DC/DC 转换器 物联网

5G、人工智能、物联网、云计算技术快速升级,存储容量和性能需求也快速增长,全球数据量也进而呈现出爆炸式提升的状态。在海量应用场景下依靠单一的存储方式已经无法满足大规模非结构数据,如何在可控成本内高效、弹性地应对每一次数据...

关键字: SSD 存储 物联网

在数字化、智能化的浪潮下,物联网(IoT)技术正以前所未有的速度改变着我们的生活和工作方式。从智能家居到工业自动化,从智慧城市到智能交通,物联网的触角已经深入到了社会的各个角落。而在这一庞大的网络中,物联网交换机发挥着至...

关键字: 物联网 物联网交换机

2024年4月7日,高性能舌簧继电器的领先制造商Pickering Electronics将于4月9日至10日参加在北京国家会议中心举行的EDI CON(电子设计创新大会),并展示用于射频和高速数字开关的同轴舌簧继电器,...

关键字: 继电器 数字开关 射频
关闭
关闭