Java笔记(14) UDP通讯程序Demo
实现一个简单的UDP通信程序,仅作为笔记使用
网络编程中有三要素:IP、端口号和通信协议,分别用来确定对方在互联网上的地址、指定接受数据的软件和确定数据在网络中传输的规则。
IP地址
IP地址分为IPv4地址和IPv6地址,这里不做讨论。
IPv4地址中分为公网地址(万维网使用)和私有地址(局域网使用)。192.168.开头的就是私有地址,范围是192.168.0.0--192.168.255.255。另外还有一个特殊地址:127.0.0.1,也可以是localhost,称为回送地址,也称本机IP。与在局域网中被分配的IPv4地址来说,该地址永远指向自身,而分配的IP地址,有可能随着连接时间和地点的变换而变换。
端口号
端口号是应用程序在设备中唯一的标识,有两个字节标识的整数组成,因此取值范围为065535。其中01023之间的端口固定用于一些知名的网络服务或者应用。一个端口号只能被一个应用占用。
协议
互联网通信协议分为OSI参考模型和TCP/IP参考模型,这里不做讨论。
两种运行在传输层的协议:
- UDP协议:用户数据包协议(User Datagram Protocol)。UDP是面向无连接的通信协议。速度较快,但有大小限制,一次最多发送64k,是数据不安全的,易丢失数据。
- TCP协议:传输控制协议(Transmission Control Protocol)。TCP协议是面向连接的通信协议。速度相较于UDP较慢,但没有大小限制,是数据安全的。
UDP通信程序流程
发送数据
- 创建发送端的 DatagramSocket对象
- 数据打包 DatagramPacket
- 发送数据
- 释放资源
接收数据
- 创建接收端的 DatagramSocket
- 接收打包好的数据
- 解析数据包
- 释放资源
UDP-Sender实现
public class SendMessageDemo {
public static void main(String[] args) throws IOException {
//1. 创建发送端的 DatagramSocket,空参表示不指定端口,随机使用可用端口
DatagramSocket socket = new DatagramSocket();
//2. 将数据封装进 DatagramPacket 对象中,作为发送者,需要指定接收方的IP和接受端口号
String str = "Hello";
byte[] bytes = str.getBytes();
InetAddress address = InetAddress.getByName("HIIBIRD");//get target IP address
DatagramPacket packet = new DatagramPacket(bytes, bytes.length, address, 10086);
//3. 发送打包的数据包
socket.send(packet);
//4. 端口号资源是有限的,发送完成后释放端口号
socket.close();
}
}
UDP-Receiver实现
public class ReceiveMessageDemo {
public static void main(String[] args) throws IOException {
//1. 创建接收端的 DatagramSocket,作为接收方,需要指定使用哪个接口进行接受
DatagramSocket socket = new DatagramSocket(10086);
//2.接收打包好的数据,由于数据通过DatagramPacket对象发送,接收端也需要创建一个DatagramPacket对象来接收
byte[] bytes = new byte[1024];
DatagramPacket packet = new DatagramPacket(bytes, bytes.length);
//这个方法是阻塞的,程序会一致在这里等待
socket.receive(packet);
//3. 解析数据,接收方可以得到以下信息:发送的数据包、数据长度、发送发地址、发送方使用的端口号
byte[] data = packet.getData();
int len = packet.getLength();
InetAddress address = packet.getAddress();
int port = packet.getPort();
System.out.println("Received data: " + new String(data, 0, len));
System.out.println("This data was send from " + port + "port of the " + address + " computer");
//4. 释放资源
socket.close();
}
}
需要先运行接收端程序,接收程序阻塞等待接受数据。然后运行发送端程序,发送数据。
热门相关:桃花 时间都知道(唐嫣、窦骁、杨烁主演) 致灿烂的你 寂静王冠 天启预报