udp协议是一种不可靠的网络协议,他在通信实例的两端各建一个socket,但这两个socket之间并没有虚拟链路,这两个socket只是发送、接收数据报对象,java提供datagramsocket对象作为基于UDP协议的socket,使用datagramPAcket代表datagramsocket发送、接收的数据报。
udp协议是英文
User Datagram Protocol的缩写,即用户数据报协议,主要用来支持那些需要在计算机之间传输数据的网络连接。UDP协议从问世到至今已经使用了很多年,虽然UDP协议目前应用不如TCP协议广泛,但UDP协议依然是一个非常实用和可行的网络传输协议。尤其在一些实时性很强的应用场景,比如网络游戏、视频会议等、UDP协议的快速更具有独特的魅力。
udp学医是一种面向非连接 的协议,面向非连接指的是在正式通信前不必与对方先建立连接,不管对方的状态就直接发送,至于对方是否可以接受到这些数据,udp协议无法控制,因此说UDP协议是不可靠协议,UDP协议适用一次只传送少量的数据、对可靠性要求不高的应用环境。
因为UDP协议是面向非连接的协议,没有建立连接的过程,因此它的通信效率很高;但正因为如此,它的可靠性不如TCP协议。
UDP协议和TCP协议对比如下
1.TCP协议:可靠,传输大小无限制,但是需要连接建立时间,差错控制开销大。
2.UDP协议:不可靠,差错控制开销小,传输大小限制在64KN以下,不需要建立连接。
udp编程例子:
下面程序使用datagramsocket实现server/client结构的网络通信。本程序的服务器端使用循环1000次 来读取datagramsocket中的数据报,每次读取到内容之后便向该数据报的发送者送回一条信息,服务器代码如下:
Server代码
package com.udp.server;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UdpServer {
public static final int PORT = 30000;
//定义每个数据报的大小为4KB
private static final int DATA_LEN = 4096;
//定义接收网络数据的字节数组
byte[] inBuff = new byte[DATA_LEN];
//以指定字节数组创建接收数据的datagrampacket
private DatagramPacket inPacket = new DatagramPacket(inBuff, inBuff.length);
//定义一个用于发送的datagrampacket对象
private DatagramPacket outPacket;
//定义一个字符串数组,服务端发送该数组元素
String[] books = new String[]{
"疯狂java讲义",
"轻量级java EE企业应用实战",
"疯狂android讲义",
"疯狂ajax讲义"
};
public void init(){
try {
DatagramSocket socket = new DatagramSocket(PORT);
for(int i=0; i<1000; i++){
//读取socket中的数据,读到的数据放入inpacket封装的数组里
socket.receive(inPacket);
//判断inPacket,getData()和inBuff是否是同一个数组
System.out.println(inBuff == inPacket.getData());
//将接收到的内容转换成字符串后输出
System.out.println("Servlce接收到的内容:" + new String(inBuff, 0, inBuff.length));
//从字符串数组中取出一个元素最为发送数据
byte[] sendData = books[i % 4].getBytes();
//以指定的字节数组作为发送数据,以刚接收到的datagrampacket的源socketaddress作为socketaddress创建datagrampacket的目标
outPacket = new DatagramPacket(sendData, sendData.length, inPacket.getSocketAddress());
//发送数据
socket.send(outPacket);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new UdpServer().init();
}
}
上面程序中使用datagramsocket发送、接收datagramPD的代码,该程序接收1000个客户端发送过来的数据
客户端程序代码也与此类似,客户端采用循环不断的读取键盘输入,每当读取到用户输入的内容就把内容封装成datagrampacket数据报,再将该数据报发送出去;接着把datagrampacket中的数据读入接收到的datagrampacket中。
客户端的代码如下
client代码
package com.udp.client;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;
public class UdpClient {
//定义发送数据报的目的地
public static final int DEST_PORT = 30000;
public static final String DEST_IP = "127.0.0.1";
//定义每个数据报的大小为4KB
private static final int DATA_LEN = 4096;
//定义接收网络数据的字节数组
byte[] inBuff = new byte[DATA_LEN];
//以指定字节数组创建接收数据的datagrampacket
private DatagramPacket inPacket = new DatagramPacket(inBuff, inBuff.length);
//定义一个用于发送的datagrampacket对象
private DatagramPacket outPacket;
public void init(){
try {
//创建一个客户端datagramsocket,使用随机端口
DatagramSocket socket = new DatagramSocket();
//初始化发送的datagramPacket,他包含一个长度为0的字节数组
outPacket = new DatagramPacket(new byte[0], 0, InetAddress.getByName(DEST_IP), DEST_PORT);
//创建键盘输入流
Scanner scan = new Scanner(System.in);
//不断地读取键盘的输入
while(scan.hasNextLine()){
//将键盘输入的一行字符串转换成字节数组
byte[] buff = scan.nextLine().getBytes();
//设置发送用的datagrampacket中的字节数组
outPacket.setData(buff);
//发送数据报
socket.send(outPacket);
//读取socket中的数据,读到的数据放在inpacket所封装的字节数组中
socket.receive(inPacket);
System.out.println("client接收到的内容" + new String(inBuff, 0, inPacket.getLength()));
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new UdpClient().init();
}
}
客户端的代码与服务器相似,而客户端与服务器端的唯一区别在于:服务器端的IP地址、端口是固定的,所以客户端可以直接将该数据报发送给服务器端,而服务器端则需要根据收到的数据报来决定“反馈”数据报的目的地。
声明:文章内容摘自李刚《疯狂java讲义》,欢迎转载学习并注明次原文地址
http://fuchangle.iteye.com/admin/blogs/1752117
分享到:
相关推荐
UDP(User Datagram Protocol)是传输层的一个协议,它...通过这个压缩包中的"udp"文件,你可以找到具体的代码示例,学习如何在实际编程中使用UDP协议。动手实践这些例子,将有助于你深入理解UDP的工作原理和编程技巧。
UDP协议的核心特征包括: 1. **无连接**:与TCP不同,UDP不建立连接,而是直接发送数据包,因此没有握手过程,降低了延迟。 2. **面向事务**:每个UDP数据包被视为独立的事务,没有顺序保证或重传机制。 3. **不...
基于UDP协议开发的即时聊天室python源码(含客户端+服务端).zip基于UDP协议开发的即时聊天室python源码(含客户端+服务端).zip基于UDP协议开发的即时聊天室python源码(含客户端+服务端).zip基于UDP协议开发的即时聊天...
TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)是互联网协议族中最常见...同时,结合0012.tcp-udp协议.wmv视频资源,可以更直观地看到这两种协议在通信过程中的动态表现,从而加深理解和记忆。
网络层之上是传输层,它分为UDP协议和TCP协议,负责提供端到端的通信。传输层之上是应用层,用户可以直接接触到的应用协议如HTTP、FTP等都位于此层。 在了解互联网协议的过程中,作者阮一峰也涉及了用户的上网设置...
#### 一、UDP协议简介 **UDP**(User Datagram Protocol),中文名为用户数据报协议,是OSI参考模型中的一种无连接的传输层协议,提供了面向事务的简单不可靠信息传送服务。UDP协议作为IETF RFC 768标准的一部分,其...
本教程将围绕“安卓 UDP 文件传输入门版”这一主题,详细介绍如何使用UDP协议实现在两台安卓设备之间进行文件传输。 首先,我们需要理解UDP的工作原理。与TCP(Transmission Control Protocol)不同,UDP不建立连接...
这个"tcpudp入门程序.zip"包含的资源可能是一个简单的TCP和UDP服务器及客户端的实现,帮助初学者理解这两个协议的工作原理。`TCP的编程流程.tif`和`UDP的编程流程.tif`可能是流程图,清晰展示TCP和UDP服务器的编程...
**UDP协议详解:** UDP是一种无连接的、不可靠的传输协议,它不保证数据包的顺序、完整性和可靠性。这意味着UDP不进行拥塞控制,也不建立连接,而是直接将数据包发送到网络上。由于其轻量级的特性,UDP常用于实时...
UDP协议的主要特性包括: 1. 无连接性:发送数据无需预先建立连接,直接将数据发送到网络。 2. 面向报文:UDP保持报文边界,不进行拆分或合并,应用程序需要考虑合适的报文大小。 3. 尽力交付:不保证数据的可靠传输...
**三、UDP协议简介** 用户数据报协议(UDP)是一种无连接的传输层协议,它不提供确认、重传或者拥塞控制,因此它的开销小、效率高,常用于实时数据传输,如音频、视频流等。UDP通信包括两个主要步骤:发送端创建数据...
Socket是.NET框架中最底层的网络通信接口,它可以用于TCP和UDP协议,甚至其他的网络协议。Socket提供了更多的控制权,可以定制更复杂的通信策略。对于TCP,我们可以使用Socket的Accept或BeginAccept方法来监听和接受...
创建一个UDP套接字,使用`socket(AF_INET, SOCK_DGRAM)`,其中`AF_INET`表示使用IPv4地址,`SOCK_DGRAM`表示使用UDP协议。 2. **地址结构体**:在UDP通信中,我们需要用到`struct sockaddr_in`来表示IP地址和端口号...
1. UDP协议基础 UDP是一种无连接的协议,这意味着在数据传输前,它不需要建立连接,因此节省了建立和维护连接的时间。然而,这也意味着它不保证数据的可靠传输,可能会有数据丢失、重复或乱序的情况。UDP通过使用...
本列程是基于QT主窗口实现的UDP通信,UDP数据报协议是一个面向无连接的传输层报文协议,它简单易用,不存在TCP协议“粘包”的问题,在强调实时、主动推送的系统中,常常用UDP协议来实现网络双方的通信。UDP发送报文...
1. **建立Socket连接**:开发者需要指定Socket的类型(如TCP或UDP)、地址格式(如AF_INET)以及通信协议(如SOCK_STREAM或SOCK_DGRAM)。SOCK_STREAM对应TCP,提供可靠、面向连接的服务,适合需要保证数据完整性的...
IPv6,全称为Internet Protocol Version 6,是互联网协议的第六版,是为了解决IPv4地址耗尽问题而设计的下一代互联网协议。IPv6在IPv4的基础上进行了大量的改进和扩展,提供了更大的地址空间,提高了网络效率,增强...
本资源提供了入门级的TCP和UDP传输的源码,非常适合初学者用来理解和实践这两种协议。 TCP,全称传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP通过三次握手建立连接,确保数据传输前...
5. TCP/IP协议栈中UDP协议的工作机制。 通过对压缩包中的代码进行分析和实践,学习者能够增强对嵌入式网络编程的理解,进一步提升在STM32平台上的开发能力。同时,这个项目也可以作为其他STM32系列芯片实现UDP通信...
"UDP" 标签代表了本项目使用了UDP协议,这是一种无连接的传输层协议,适合于对实时性要求较高但对数据完整性要求较低的场景。"MINA2" 标签则表明项目采用了Apache MINA2框架,一个基于NIO(非阻塞I/O)的网络编程库...