`

UDP协议入门

阅读更多
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
0
0
分享到:
评论

相关推荐

    udp例子,入门编程实例

    UDP(User Datagram Protocol)是传输层的一个协议,它...通过这个压缩包中的"udp"文件,你可以找到具体的代码示例,学习如何在实际编程中使用UDP协议。动手实践这些例子,将有助于你深入理解UDP的工作原理和编程技巧。

    C#_UDP_入门.doc

    UDP协议的核心特征包括: 1. **无连接**:与TCP不同,UDP不建立连接,而是直接发送数据包,因此没有握手过程,降低了延迟。 2. **面向事务**:每个UDP数据包被视为独立的事务,没有顺序保证或重传机制。 3. **不...

    基于UDP协议开发的即时聊天室python源码(含客户端+服务端).zip

    基于UDP协议开发的即时聊天室python源码(含客户端+服务端).zip基于UDP协议开发的即时聊天室python源码(含客户端+服务端).zip基于UDP协议开发的即时聊天室python源码(含客户端+服务端).zip基于UDP协议开发的即时聊天...

    tcp-udp协议

    TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)是互联网协议族中最常见...同时,结合0012.tcp-udp协议.wmv视频资源,可以更直观地看到这两种协议在通信过程中的动态表现,从而加深理解和记忆。

    互联网协议入门(作者阮一峰)

    网络层之上是传输层,它分为UDP协议和TCP协议,负责提供端到端的通信。传输层之上是应用层,用户可以直接接触到的应用协议如HTTP、FTP等都位于此层。 在了解互联网协议的过程中,作者阮一峰也涉及了用户的上网设置...

    C# UDP 入门.pdf

    #### 一、UDP协议简介 **UDP**(User Datagram Protocol),中文名为用户数据报协议,是OSI参考模型中的一种无连接的传输层协议,提供了面向事务的简单不可靠信息传送服务。UDP协议作为IETF RFC 768标准的一部分,其...

    安卓 udp 文件传输入门版

    本教程将围绕“安卓 UDP 文件传输入门版”这一主题,详细介绍如何使用UDP协议实现在两台安卓设备之间进行文件传输。 首先,我们需要理解UDP的工作原理。与TCP(Transmission Control Protocol)不同,UDP不建立连接...

    tcpudp入门程序.zip_Linux TCPUDP_QPN_UDP_tcp server_关于tcp/udp的一个入门程序

    这个"tcpudp入门程序.zip"包含的资源可能是一个简单的TCP和UDP服务器及客户端的实现,帮助初学者理解这两个协议的工作原理。`TCP的编程流程.tif`和`UDP的编程流程.tif`可能是流程图,清晰展示TCP和UDP服务器的编程...

    收集的udp/tcp入门例子

    **UDP协议详解:** UDP是一种无连接的、不可靠的传输协议,它不保证数据包的顺序、完整性和可靠性。这意味着UDP不进行拥塞控制,也不建立连接,而是直接将数据包发送到网络上。由于其轻量级的特性,UDP常用于实时...

    C#_UDP通讯入门与简单示例

    UDP协议的主要特性包括: 1. 无连接性:发送数据无需预先建立连接,直接将数据发送到网络。 2. 面向报文:UDP保持报文边界,不进行拆分或合并,应用程序需要考虑合适的报文大小。 3. 尽力交付:不保证数据的可靠传输...

    基于LwIP的LM3S的UDP简单入门例程(包括下位机与上位机的源代码)

    **三、UDP协议简介** 用户数据报协议(UDP)是一种无连接的传输层协议,它不提供确认、重传或者拥塞控制,因此它的开销小、效率高,常用于实时数据传输,如音频、视频流等。UDP通信包括两个主要步骤:发送端创建数据...

    C#之TcpClient,UdpClient,Socket入门实例

    Socket是.NET框架中最底层的网络通信接口,它可以用于TCP和UDP协议,甚至其他的网络协议。Socket提供了更多的控制权,可以定制更复杂的通信策略。对于TCP,我们可以使用Socket的Accept或BeginAccept方法来监听和接受...

    client是一个UDP的简单例子,对入门的朋友有用哦

    创建一个UDP套接字,使用`socket(AF_INET, SOCK_DGRAM)`,其中`AF_INET`表示使用IPv4地址,`SOCK_DGRAM`表示使用UDP协议。 2. **地址结构体**:在UDP通信中,我们需要用到`struct sockaddr_in`来表示IP地址和端口号...

    udp-demo.rar_DEMO_UDP_UDP 学习资料_c# UDP

    1. UDP协议基础 UDP是一种无连接的协议,这意味着在数据传输前,它不需要建立连接,因此节省了建立和维护连接的时间。然而,这也意味着它不保证数据的可靠传输,可能会有数据丢失、重复或乱序的情况。UDP通过使用...

    QT基于主窗口实现UDP通信

    本列程是基于QT主窗口实现的UDP通信,UDP数据报协议是一个面向无连接的传输层报文协议,它简单易用,不存在TCP协议“粘包”的问题,在强调实时、主动推送的系统中,常常用UDP协议来实现网络双方的通信。UDP发送报文...

    socket原理关于tcp与udp的基础入门

    1. **建立Socket连接**:开发者需要指定Socket的类型(如TCP或UDP)、地址格式(如AF_INET)以及通信协议(如SOCK_STREAM或SOCK_DGRAM)。SOCK_STREAM对应TCP,提供可靠、面向连接的服务,适合需要保证数据完整性的...

    IPv6之二:IPv6简介与协议入门(下) IPv6之二:IPv6简介与协议入门(下)

    IPv6,全称为Internet Protocol Version 6,是互联网协议的第六版,是为了解决IPv4地址耗尽问题而设计的下一代互联网协议。IPv6在IPv4的基础上进行了大量的改进和扩展,提供了更大的地址空间,提高了网络效率,增强...

    TCP和UDP传输源码

    本资源提供了入门级的TCP和UDP传输的源码,非常适合初学者用来理解和实践这两种协议。 TCP,全称传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP通过三次握手建立连接,确保数据传输前...

    UDP_send.rar_107 udp_STM32F107-LWIP_UDP_lwip udp stm32f107_stm32

    5. TCP/IP协议栈中UDP协议的工作机制。 通过对压缩包中的代码进行分析和实践,学习者能够增强对嵌入式网络编程的理解,进一步提升在STM32平台上的开发能力。同时,这个项目也可以作为其他STM32系列芯片实现UDP通信...

    服务端基于MINA2的UDP双向通信Demo演示(MINA2服务端)

    "UDP" 标签代表了本项目使用了UDP协议,这是一种无连接的传输层协议,适合于对实时性要求较高但对数据完整性要求较低的场景。"MINA2" 标签则表明项目采用了Apache MINA2框架,一个基于NIO(非阻塞I/O)的网络编程库...

Global site tag (gtag.js) - Google Analytics