Java UDP通信:DatagramPacket与DatagramSocket 详解

一、UDP协议简介

UDP(UserDatagramProtocol)是一个简单的面向消息的传输层协议,尽管UDP提供标头和有效负载的完整性验证(通过校验和),但它不保证向上层协议提供消息传递,并且UDP层在发送后不会保留UDP 消息的状态。因此,UDP有时被称为不可靠的数据报协议。如果需要传输可靠性,则必须在用户应用程序中实现。

  • UDP是基于IP的简单协议,不可靠的协议。
  • UDP的优点:简单,轻量化。
  • UDP的缺点:没有流控制,没有应答确认机制,不能解决丢包、重发、错序问题。

综上所述,UDP使用场景为流媒体应用、语音交流、视频会议所使用的传输层协议,还有许多基于互联网的电话服务使用的VOIP(基于IP的语音)也是基于UDP运行的,实时视频和音频流协议旨在处理偶尔丢失的数据包,因此,如果重新传输丢失的数据包,则只会发生质量略有下降,而不是出现较大的延迟。


二、DatagramSocket 类

DatagramSocket 类用于表示发送和接收数据报包的套接字。数据报包套接字是包投递服务的发送或接收点。每个在数据报包套接字上发送或接收的包都是单独编址和路由的。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。

一 、构造方法

(1)DatagramSocket()
绑定到本地地址和一个随机的端口号

(2)DatagramSocket(int port)
绑定本地地址和一个特定的端口号

(3)DatagramSocket(int port, InetAddress iad)
绑定到特定的端口号及指定地址

(4)DatagramSocket(SocketAddress sad)
绑定指定地址和随机端口号

二、基本方法

(1)close()
关闭套接字

(2)recevie(DatagramPacket dp)
接受数据报

(3)send(DatagramPacket dp)
发送数据报


三、DatagramPacket 类

java.net 包中的 DatagramPacket 类用来表示数据报包,数据报包用来实现无连接包投递服务。每条报文仅根据该包中包含的信息从一台机器路由到另一台机器。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。

一、接受类型

(1)DatagramPacket(byte[] buf, int length)
用来接受长度为length的buf数据(即数据存于字节数组buf中)

二、发送类型

(1)DatagramPacket(byte[] buf, int length, InetAddress address, int port)
将length长的buf数据发送到指定的地址的端口号处

(2)DatagramPacket(byte[] buf, int length, SocketAddress address)
将length长的buf数据发送到指定的套接字地址处


四、代码示例

1、一个发送方,一个接收方
2、先运行接收方,再运行发送方

UdpReceive

public class UdpReceive {
	public static void main(String[] args) throws IOException {
		DatagramSocket datagramSocket = new DatagramSocket(1111); 
		DatagramPacket datagramPacket = new DatagramPacket(new byte[1024], 1024);
		datagramSocket.receive(datagramPacket); // 接收数据

		byte[] arr = datagramPacket.getData(); // 获取数据
		int len = datagramPacket.getLength(); // 获取有效长度
		System.out.println(new String(arr, 0, len));
		datagramSocket.close(); // 关闭
	}
}

UdpSend

public class UdpSend {
	public static void main(String[] args) throws IOException { // 异常处理
		String str = "法国的欢呼雀跃掩映着一个人的寂寥无言,梅西就这样孤独地站在原地,空空如也,满泪哀伤,仿佛是上天的安排,"
				+ "在梅西告别世界杯的同一天,C罗也在这一天挥手再见,卡瓦尼用两粒精彩绝伦的进球终结了C罗的世界杯之梦,绝代双骄,同天告别,"
				+ "这是猝不及防却必须承受的生命之重,31岁的梅西,33岁的C罗,他们真的已不再年轻,这一天,时光好像悄悄拉上了一代人青春的大幕,"
				+ "无人知晓,最好的他们会否在四年之后等在下一个重逢的路口。人生里有这样一首诗:当我们拥有他时,还无法读懂,当我们读懂他时,"
				+ "他却已悄然远走,这首诗,就是青春!惟愿岁月在匆匆无情中对他们写尽温柔,惟愿时光在飘飘风雨里让他们依旧坚守,"
				+ "此时,讲不出再见,此刻,诉不尽离愁,一壶浊酒尽余欢,今宵别梦寒!";
		DatagramSocket datagramSocket = new DatagramSocket(); // 创建DatagramSocket
		DatagramPacket datagramPacket = new DatagramPacket(str.getBytes(),
				str.getBytes().length, InetAddress.getByName("127.0.0.1"), 1111); // 创建DatagramPacket(要发送的数据,数据的长度,Ip地址,端口)
		datagramSocket.send(datagramPacket); // 发送
		datagramSocket.close(); // 关闭
	}
}
  • 20
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Java UDP通信编程的源码如下: ```java import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class UDPClient { public static void main(String[] args) { try { // 创建UDP套接字 DatagramSocket clientSocket = new DatagramSocket(); // 设置服务器的IP地址和端口号 InetAddress serverIP = InetAddress.getByName("127.0.0.1"); int serverPort = 9999; // 将消息转换成字节数组 String message = "Hello, Server!"; byte[] sendData = message.getBytes(); // 创建UDP数据包 DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, serverIP, serverPort); // 发送数据包到服务器 clientSocket.send(sendPacket); System.out.println("发送消息到服务器: " + message); // 接收来自服务器的响应 byte[] receiveData = new byte[1024]; DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); clientSocket.receive(receivePacket); // 将接收到的字节数组转换成字符串 String response = new String(receivePacket.getData()); System.out.println("接收到来自服务器的响应: " + response.trim()); // 关闭UDP套接字 clientSocket.close(); } catch (Exception e) { e.printStackTrace(); } } } import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class UDPServer { public static void main(String[] args) { try { // 创建UDP套接字并绑定端口号 DatagramSocket serverSocket = new DatagramSocket(9999); System.out.println("服务器已启动,等待客户端消息..."); while (true) { // 创建接收数据包 byte[] receiveData = new byte[1024]; DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); // 接收客户端消息 serverSocket.receive(receivePacket); // 将接收到的字节数组转换成字符串 String message = new String(receivePacket.getData()).trim(); System.out.println("接收到客户端消息: " + message); // 获取客户端IP地址和端口号 InetAddress clientIP = receivePacket.getAddress(); int clientPort = receivePacket.getPort(); // 准备响应消息 String response = "Hello, Client!"; byte[] sendData = response.getBytes(); // 创建发送数据包 DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, clientIP, clientPort); // 发送响应消息到客户端 serverSocket.send(sendPacket); System.out.println("发送响应消息到客户端: " + response); } } catch (Exception e) { e.printStackTrace(); } } } ``` 以上代码展示了一个简单的Java UDP通信的例子。其中UDPClient类代表客户端,UDPServer类代表服务器端。客户端通过DatagramSocket发送消息到服务器端,服务器端接收到消息后进行处理,并将响应消息发送回客户端。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值