1.基本概念:
a.DatagramPacket与DatagramSocket位于java.net包中
b.DatagramPacket表示存放数据的数据报,DatagramSocket表示接受或发送数据报的套接字
c.由这两个类所有构成的网络链接是基于UDP协议,是一种不可靠的协议。
之所以不可靠是因为发送方不负责数据是否发送成功,接收方收到数据时也不会 向发送方反馈成功消息,容易导致信息的丢失。
但是这种协议却是快捷的,比如CS(半条命)游戏就是基于UDP协议,否则我们估计 要玩一次游戏后就会把机子砸了,所以我们可以看到游戏有时会失帧。
2.使用方法:
要建立基于UDP协议的链接,我们应该先建立套接字<DatagramSocket>(即发送站或接收站),之后通过套接字发送或接受数据<DatagramPacket>。
我们先了解一下DatagramSocket和DatagramPacket类
DatagramSocket类:
构造方法:
DatagramSocket():
表示创建一个默认的套接字,并绑定到本地地址和一个随机的端口号
DatagramSocket(int port):
与上面不同的是,绑定到特定端口号,其它不变
DatagramSocket(int port, InetAddress iad):
表示创建一个套接字,绑定到特定的端口号及指定地址
DatagramSocket(SocketAddress sad);
表示创建一个套接字,绑定到特定的套接字地址
小提示:所谓的本地地址我们可以这样来理解,我们通过“控制面板-本地连接-支持”中可以看到一个IP地址,这就是本地的IP地址,也暂且理解为本地地址。
基本方法:
close():
关闭套接字
recevie(DatagramPacket dp):
接受数据报
send(DatagramPacket dp):
发送数据报
这里触及了数据报,下面介绍数据报:
DatagramPacket类:
构造方法:(只列出主要的)
接受类型:
DatagramPacket(byte[] buf, int length):
用来接受长度为length的buf数据(即数据存于字节数组buf中)
发送类型:
DatagramPacket(byte[] buf, int length, InetAddress address, int port);
将length长的buf数据发送到指定的地址的端口号处
DatagramPacket(byte[] buf, int length, SocketAddress address);
将length长的buf数据发送到指定的套接字地址处
有上面可知,我们发送数据时构造的数据报应该是发送类型的,而接受数据报时应该是接受类型的
开始书写代码
代码意图:
1.一个接收方,一个发送方
2.当接收方收到发送方发送的消息后,打印发送的消息及发送方的地址和端口号,之后向发送反馈一条信息“接受方:我收到了!”
3.发送方打印出接收方反馈的消息
详细思路见代码:
[java] view plaincopyprint?
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class Sender {
public static void main(String[] args) {
try {
// 创建发送方的套接字,IP默认为本地,端口号随机
DatagramSocket sendSocket = new DatagramSocket();
// 确定要发送的消息:
String mes = "你好!接收方!";
// 由于数据报的数据是以字符数组传的形式存储的,所以传转数据
byte[] buf = mes.getBytes();
// 确定发送方的IP地址及端口号,地址为本地机器地址
int port = 8888;
InetAddress ip = InetAddress.getLocalHost();
// 创建发送类型的数据报:
DatagramPacket sendPacket = new DatagramPacket(buf, buf.length, ip,
port);
// 通过套接字发送数据:
sendSocket.send(sendPacket);
// 确定接受反馈数据的缓冲存储器,即存储数据的字节数组
byte[] getBuf = new byte[1024];
// 创建接受类型的数据报
DatagramPacket getPacket = new DatagramPacket(getBuf, getBuf.length);
// 通过套接字接受数据
sendSocket.receive(getPacket);
// 解析反馈的消息,并打印
String backMes = new String(getBuf, 0, getPacket.getLength());
System.out.println("接受方返回的消息:" + backMes);
// 关闭套接字
sendSocket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketAddress;
public class Receive {
public static void main(String[] args) {
try {
// 确定接受方的IP和端口号,IP地址为本地机器地址
InetAddress ip = InetAddress.getLocalHost();
int port = 8888;
// 创建接收方的套接字,并制定端口号和IP地址
DatagramSocket getSocket = new DatagramSocket(port, ip);
// 确定数据报接受的数据的数组大小
byte[] buf = new byte[1024];
// 创建接受类型的数据报,数据将存储在buf中
DatagramPacket getPacket = new DatagramPacket(buf, buf.length);
// 通过套接字接收数据
getSocket.receive(getPacket);
// 解析发送方传递的消息,并打印
String getMes = new String(buf, 0, getPacket.getLength());
System.out.println("对方发送的消息:" + getMes);
// 通过数据报得到发送方的IP和端口号,并打印
InetAddress sendIP = getPacket.getAddress();
int sendPort = getPacket.getPort();
System.out.println("对方的IP地址是:" + sendIP.getHostAddress());
System.out.println("对方的端口号是:" + sendPort);
// 通过数据报得到发送方的套接字地址
SocketAddress sendAddress = getPacket.getSocketAddress();
// 确定要反馈发送方的消息内容,并转换为字节数组
String feedback = "接收方说:我收到了!";
byte[] backBuf = feedback.getBytes();
// 创建发送类型的数据报
DatagramPacket sendPacket = new DatagramPacket(backBuf,
backBuf.length, sendAddress);
// 通过套接字发送数据
getSocket.send(sendPacket);
// 关闭套接字
getSocket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
测试已通过
先启动接收方,然后启动发送方即可
分享到:
相关推荐
本篇将详细探讨UDP编程中的关键组件——`DatagramSocket`和`DatagramPacket`,以及如何利用它们进行数据的发送和接收。 `DatagramSocket`是Java提供的一个类,它代表了UDP通信中的一个端点。通过这个类,我们可以...
基于UDP协议的Socket编程主要涉及两个关键类:`DatagramPacket`和`DatagramSocket`,这两个类都位于Java的`java.net`包中。 `DatagramPacket`类是UDP通信的核心,它负责封装和解析实际传输的数据。当需要发送数据时...
本文将深入探讨基于UDP(User Datagram Protocol)的手机与电脑之间的通信实例。UDP是一种无连接的传输层协议,它提供了快速的数据传输服务,但不保证数据的可靠性和顺序。这使得UDP在实时应用如在线游戏、视频流...
通常,PING基于ICMP(Internet Control Message Protocol)协议,但在这个特定的课程设计中,我们将关注如何使用UDP(User Datagram Protocol)来实现类似的机制。下面将详细解释基于UDP的PING实现以及相关的Java...
对于UDP,主要有两个关键类:DatagramSocket和DatagramPacket。 3. DatagramSocket类: DatagramSocket是发送和接收UDP数据报的类。通过创建DatagramSocket实例,我们可以绑定到特定的IP地址和端口号,然后使用...
在Java中,实现UDP通信主要涉及两个类:`java.net.DatagramSocket`和`java.net.DatagramPacket`。`DatagramSocket`类代表一个UDP套接字,用于发送和接收数据报文。`DatagramPacket`则封装了要发送的数据和目标地址...
【标题】:“基于UDP通信的聊天程序” 【描述】:“基于UDP通信的聊天设计,设有注册和登陆。附有代码(全)” 【标签】:“UDP 计算机网络” 【正文】: UDP(User Datagram Protocol)是一种无连接的、不可靠...
UDP(User Datagram Protocol)是一种无...在给定的项目“udp_Ping_JAVAping_javaudpping_java_基于UDP的PING_udp_Ping”中,你可以找到实现这些功能的具体代码,进一步学习和理解Java如何操作UDP套接字进行数据通信。
在IT行业中,网络编程是构建分布式系统和网络应用的基础,而UDP(User Datagram Protocol)作为传输层协议之...在Java环境中,利用`DatagramSocket`和`DatagramPacket`类,我们可以轻松地创建UDP通信的客户端和服务端。
对于UDP,我们使用`DatagramSocket`来创建一个数据报Socket,通过`send(DatagramPacket)`发送数据,`receive(DatagramPacket)`接收数据。每个UDP数据报包含完整的源和目的地址信息,因此无需像TCP那样建立连接。 在...
此外,开发这样的聊天程序还需要熟悉Java的Socket编程,包括DatagramSocket类用于创建UDP套接字,以及DatagramPacket类用于封装和解封装数据报。开发者还需要具备良好的错误处理和异常处理能力,以应对网络波动、...
Java基于UDP协议的可靠通信系统设计与实现是一个关键的网络编程课题,主要涉及到网络通信的基础原理、UDP协议的特性和如何克服其不可靠性。在这个项目中,源码分为"Client"和"Server"两个部分,分别代表客户端和...
Java基于UDP协议的聊天程序是一种实现网络通信的应用实例,它利用了UDP(User Datagram Protocol,用户数据报协议)这一无连接、不可靠的传输协议。UDP的特点在于其速度较快,因为不需要建立和维护连接,适合实时性...
在上述文件中,还提供了一个完整的 UDP 单播服务器端代码实现,使用 DatagramSocket 和 DatagramPacket 两个类,实现基于 UDP 的用户登陆信息接收。 UDP 协议是一种无连接的、不可靠的、无序的通信协议,广泛应用于...
在Java中,我们可以通过Java的Socket编程API来实现UDP通信,主要涉及两个类:`DatagramSocket`和`DatagramPacket`。`DatagramSocket`用于创建一个UDP套接字,它允许发送和接收数据报。`DatagramPacket`则用于封装要...
《基于UDP通信机制的航班显示系统应用软件详解》 在当今信息化时代,机场航班显示系统是旅客获取航班信息的重要途径,高效、稳定的通信机制对于确保系统正常运行至关重要。本项目中,我们采用UDP(User Datagram ...
* Java语言提供了多种方式来实现UDP编程,例如使用DatagramSocket类和DatagramPacket类来发送和接收数据报文。 * 在Java语言中,UDP编程可以使用以下步骤:创建 DatagramSocket 对象、设置服务器端口、发送数据报文...
Java聊天程序基于UDP协议,这是一种使用用户数据报协议(User Datagram Protocol)来实现网络通信的简单聊天工具。UDP是传输层的一种无连接协议,与TCP相比,它更注重速度和效率,而对数据的可靠传输则相对较少保障...
本程序“android socket UDP 通信”就是针对这种需求设计的,它实现了Android设备与服务器之间的UDP Socket通信,支持三次来回交互并能传递多条独立的数据。 首先,我们来理解UDP协议的基本概念。UDP是一种无连接的...
2. **Java套接字编程**:在Java中,`java.net.DatagramSocket`类用于创建UDP套接字,`java.net.DatagramPacket`类用于封装数据和目标/源IP地址及端口号。开发时,需要创建发送和接收端的DatagramSocket,并通过...