UDP协议
UDP协议的全称是用户数据报,在网络中它与TCP协议一样用于处理数据包。在OSI模型中,在第四层——传输层,处于IP协议的上一层。UDP有不提供数据报分组、组装和不能对数据包的排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。
为什么要使用UDP
在选择使用协议的时候,选择UDP必须要谨慎。在网络质量令人不十分满意的环境下,UDP协议数据包丢失会比较严重。但是由于UDP的特性:它不属于连接型协议,因而具有资源消耗小,处理速度快的优点,所以通常音频、视频和普通数据在传送时使用UDP较多,因为它们即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。比如我们聊天用的ICQ和OICQ就是使用的UDP协议。
在Java中操纵UDP
使用位于JDK中Java.net包下的DatagramSocket和DatagramPacket类,可以非常方便地控制用户数据报文。在描述它们之前,必须了解位于同一个位置的InetAddress类。InetAddress实现了Java.io.Serializable接口,不允许继承。它用于描述和包装一个Internet IP地址,通过三个方法返回InetAddress实例:
getLocalhost():返回封装本地地址的实例。
getAllByName(String host):返回封装Host地址的InetAddress实例数组。
getByName(String host):返回一个封装Host地址的实例。其中,Host可以是域名或者是一个合法的IP地址。
DatagramSocket类用于创建接收和发送UDP的Socket实例。和Socket类依赖SocketImpl 类一样,DatagramSocket类的实现也依靠专门为它设计的DatagramScoketImplFactory类。DatagramSocket类 有3个构建器:
DatagramSocket():创建实例。这是个比较特殊的用法,通常用于客户端编程,它并没有特定监听的端口,仅仅使用一个临时的。
DatagramSocket(int port):创建实例,并固定监听Port端口的报文。
DatagramSocket(int port, InetAddress localAddr):这是个非常有用的构建器,当一台机器拥有多于一个IP地址的时候,由它创建的实例仅仅接收来自LocalAddr的报文。
值得注意的是,在创建DatagramSocket类实例时,如果端口已经被使用,会产生一个SocketException的异常抛出,并导致程序非法终止,这个异常应该注意捕获。DatagramSocket类最主要的方法有4个:
receive(DatagramPacket d):接收数据报文到d中。receive方法产生一个“阻塞”。
send(DatagramPacket d):发送报文d到目的地。
setSoTimeout(int timeout):设置超时时间,单位为毫秒。
close():关闭DatagramSocket。在应用程序退出的时候,通常会主动释放资源,关闭Socket,但是由于异常地退出可能造成资源无法回收。所以,应该在程序完成时,主动使用此方法关闭Socket,或在捕获到异常抛出后关闭Socket。
“阻塞”是一个专业名词,它会产生一个内部循环,使程序暂停在这个地方,直到一个条件触发。
DatagramPacket类用于处理报文,它将Byte数组、目标地址、目标端口等数据包装成报文或者将报文拆卸成Byte数组。应用程序在产生数据包是应该注意,TCP/IP规定数据报文大小最多包含65507个,通常主机接收548个字节,但大多数平台能够支持8192字节大小的报文。 DatagramPacket类的构建器共有4个:
DatagramPacket(byte[] buf, int length, InetAddress addr, int port):从buf数组中,取出Length长的数据创建数据包对象,目标是addr地址,port端口。
DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port):从buf数组中,取出offset开始的、length长的数据创建数据包对象,目标是addr地址,port端口。
DatagramPacket(byte[] buf, int offset, int length):将数据包中从offset开始、length长的数据装进buf数组。
DatagramPacket(byte[] buf, int length):将数据包中length长的数据装进buf数组。
DatagramPacket类最重要的方法就是getData()了,它从实例中取得报文的Byte数组编码。
实例说明
{接收数据的服务器}
byte[] buf = new byte[1000];
//开始监视12345端口
DatagramSocket ds = new DatagramSocket(12345);
//创建接收数据报的实例
DatagramPacket ip = new DatagramPacket(buf, buf.length);
while (true)
{
//阻塞,直到收到数据报后将数据装入IP中
//receive方法返回时,DatagramPacket的缓冲区填充了接收的数据,数据报包包含
//发送方的 IP 地址和发送方机器上的端口号。此方法在接收到数据报前一直阻塞。
ds.receive(ip);
System.out.println(new String(buf));
}
{发送数据的客户端}
//得到目标机器的地址实例
InetAddress target = InetAddress.getByName("www.lenovo.com");
//从9999端口发送数据报
DatagramSocket ds = new DatagramSocket(9999);
//要发送的数据
String hello = "Hello, I am come in!";
//将数据转换成Byte类型
byte[] buf = hello.getBytes();
//将buf缓冲区中的数据打包
DatagramPacket op = new DatagramPacket(buf, buf.length, target, 12345);
//发送数据
ds.send(op);
//关闭连接
ds.close();
分享到:
相关推荐
标题“使用Java控制UDP协议.rar_使用UDP协议_数据包”指出,这个压缩包包含了关于如何在Java编程环境中控制并利用UDP(User Datagram Protocol)协议进行数据包传输的知识。UDP是一种无连接的、不可靠的传输层协议,...
Java基于UDP协议的聊天程序是一种实现网络通信的应用实例,它利用了无连接的用户数据报协议(User Datagram Protocol,简称UDP)进行数据传输。在这个完整版的程序中,开发者已经完成了从设计到调试的全部过程,使其...
本篇文章将深入探讨如何使用Java语言来实现UDP协议的文件传输。 首先,我们需要了解UDP的基本原理。UDP是一种无连接的传输层协议,它不保证数据的可靠传输,也不进行拥塞控制。这意味着数据包可能会丢失、重复或...
在本文中,我们将探讨如何利用UDP协议来控制远程电脑的关机、重启以及调整音量等操作,这些都是通过网络进行的计算机管理功能。 首先,我们需要了解UDP的工作原理。与TCP(Transmission Control Protocol)不同,...
Java UDP协议实现绘圆同步是一种基于用户数据报协议(UDP)的简单通信方式,用于在客户端和服务端之间实时同步绘制图形。在这个例子中,我们有两个关键类:`DrawServer` 和 `DrawClient`。 `DrawServer` 类是服务器...
本资源提供的是基于Java实现的TCP和UDP协议的源代码,可以直接运行并验证其正确性。 TCP是一种面向连接的、可靠的协议,它确保了数据包的顺序传递和错误检测。在Java中,我们可以使用`java.net.Socket`类和`java...
在探讨使用Java JDK中Java.net包控制UDP协议的知识点时,我们不仅需要了解UDP协议的基本概念,还要深入解析其在Java编程环境中的实现方式。以下是对UDP协议的关键知识点的详细阐述,以及如何在Java中利用Java.net包...
Java作为一款跨平台的编程语言,提供了丰富的API来支持网络编程,包括对UDP协议的支持。在Java中,我们主要通过`java.net.DatagramSocket`类来创建UDP套接字,以及`java.net.DatagramPacket`类来封装发送和接收的...
Java UDP协议交互是一种基于无连接的传输层协议,用于实现控制台聊天应用。UDP(User Datagram Protocol)相较于TCP(Transmission Control Protocol)具有更快的传输速度,因为它不进行握手、确认和重传等复杂的...
Java Socket编程是网络编程的基础,它提供了在TCP和UDP协议下进行通信的能力。在这个小Demo中,我们将深入探讨如何利用Java实现这两种协议的简单应用,以及如何在TCP服务器端使用多线程监听。 首先,TCP(传输控制...
然而,这也意味着,如果数据在网络中丢失、重复或乱序,UDP协议本身不会进行任何修正,需要应用程序自行处理这些问题。 这个"UDP协议通信"的demo可能包括以下几个关键点: 1. **UDP套接字编程**:在C++、Java、...
- **UDP协议特点**:UDP是一种无连接的协议,发送数据之前不需要建立连接,没有拥塞控制,因此系统开销小,传输效率高。 - **UDP报文结构**:包括源端口号、目的端口号、长度和校验和字段,这些字段用于标识和校验...
在Java中,我们可以使用java.net包中的DatagramSocket类和DatagramPacket类来实现UDP通信。下面将详细介绍Java进行UDP编程的相关知识点。 **一、UDP的特点** 1. **无连接性**:UDP不建立连接,直接发送数据,因此...
Java UDP视频传输是一种基于用户数据报协议(User Datagram Protocol)的实时数据传输方式。UDP相较于TCP,具有更低的延迟和更高的传输效率,因为其不保证数据包的顺序、不进行重传,所以适用于对实时性要求高的应用...
总的来说,这个项目涵盖了网络协议(UDP和TCP)、数据解析(JSON)、协议对接、以及Java和Netty框架的使用。通过深入理解这些知识点,并结合具体的RuoYi-fast项目文件,我们可以构建出一个高效稳定的声呐数据对接...
Java基于UDP协议的可靠通信系统设计与实现是一个关键的网络编程课题,主要涉及到网络通信的基础原理、UDP协议的特性和如何克服其不可靠性。在这个项目中,源码分为"Client"和"Server"两个部分,分别代表客户端和...
本教程主要关注使用Java标准版(J2SE)进行UDP(用户数据报协议)通信,特别是如何发送16进制格式的报文。UDP是一种无连接的、不可靠的传输协议,适合对实时性要求高的场景,例如视频流和在线游戏。 首先,让我们...
标题中的“一个使用UDP协议写的围棋”表明这是一个基于UDP(User Datagram Protocol)网络通信协议实现的围棋应用程序。UDP是传输层的一种协议,以其快速、无连接的特点被广泛应用于实时数据交换,如在线游戏、视频...
"udp客户服务"和"java_udp服务端"则分别指代了UDP协议下的客户端和服务端编程。客户端通常主动发起连接,发送数据请求,而服务端则被动等待,接收并响应客户端的请求。 在计算机网络领域,理解如何在Java中使用UDP...