Java Socket实现UDP编程浅析
前言
UDP(User Datagram Protocol),即用户数据报协议,是一种无连接的协议。与TCP不同,它不基于连接,只是简单地向网络上的接收者发送数据报。UDP不负责确认接收到过的数据报,也不保证这些数据报能够到达接收者。UDP协议的优点在于传输数据的效率高,缺点在于数据可靠性较差。在某些应用中,数据传输的速度比数据的可靠性更重要,这时候使用UDP是最好的选择。
Java中的Socket类支持TCP和UDP协议的套接字编程,在此我们将讲解如何使用Java Socket实现UDP编程。
Socket类的构造方法
在Java Socket编程中,我们需要使用到Socket和DatagramSocket这两个类,其中Socket适用于TCP协议,在此只介绍DatagramSocket类用于实现UDP协议。DatagramSocket类提供了两个构造方法:
- DatagramSocket():构造一个未绑定到本地地址和端口号的DatagramSocket。
- DatagramSocket(int port):构造一个绑定到本地指定端口号的DatagramSocket。
DatagramPacket类的构造方法
DatagramPacket用于在UDP协议中发送和接收数据包。
- DatagramPacket(byte[] buf, int length):构造一个发送长度为length的数据包对象。
- DatagramPacket(byte[] buf, int offset, int length):构造一个发送长度为length,并从buf[offset]开始读取的数据包对象。
- DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port):构造一个接收长度为length,并将数据包发送给指定地址和端口号的数据包对象。
- DatagramPacket(byte[] buf, int length, InetAddress address, int port):构造一个接收长度为length,并将数据包发送给指定地址和端口号的数据包对象。
UDP编程步骤
1.创建DatagramSocket对象
利用DatagramSocket的构造方法创建一个UDP协议的DatagramSocket对象。
DatagramSocket socket = new DatagramSocket();
2.创建DatagramPacket对象
通过DatagramPacket的构造方法创建一个数据包对象。
byte[] buf = "Hello UDP".getBytes();
InetAddress address = InetAddress.getByName("localhost");
int port = 9999;
DatagramPacket packet = new DatagramPacket(buf, buf.length, address, port);
3.发送数据包
通过DatagramSocket的send()方法来发送数据包。
socket.send(packet);
4.接收数据包
通过DatagramSocket的receive()方法来接收数据包。
byte[] buf = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
示例1:基于UDP协议的客户端和服务器实现
Server.java
import java.io.IOException;
import java.net.*;
public class Server {
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket(9999);
byte[] buf = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
System.out.println("服务器已启动,等待客户端发送数据...");
socket.receive(packet);
System.out.println("收到客户端发送的数据:" + new String(packet.getData(), 0, packet.getLength()));
socket.close();
}
}
Client.java
import java.io.IOException;
import java.net.*;
public class Client {
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket();
byte[] buf = "Hello UDP".getBytes();
InetAddress address = InetAddress.getByName("localhost");
int port = 9999;
DatagramPacket packet = new DatagramPacket(buf, buf.length, address, port);
socket.send(packet);
socket.close();
}
}
当用Java命令依次运行Server.java和Client.java后,在服务器端会输出接收到的客户端所发来的消息:“Hello UDP”,客户端不会有其他输出。
示例2:基于UDP协议的局域网广播实现
Server.java
import java.io.IOException;
import java.net.*;
public class Server {
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket(9999);
byte[] buf = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
System.out.println("服务器已启动,等待客户端发送数据...");
while (true) {
socket.receive(packet);
System.out.println("收到客户端发送的数据:" + new String(packet.getData(), 0, packet.getLength()));
// 发送广播
byte[] b = "Hello all".getBytes();
DatagramPacket packet2 = new DatagramPacket(b, b.length, packet.getAddress(), 10000);
socket.send(packet2);
}
}
}
Client.java
import java.io.IOException;
import java.net.*;
public class Client {
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket();
byte[] buf = "Hello UDP".getBytes();
InetAddress address = InetAddress.getByName("255.255.255.255");
int port = 9999;
DatagramPacket packet = new DatagramPacket(buf, buf.length, address, port);
socket.send(packet);
// 接收广播
byte[] b = new byte[1024];
DatagramPacket packet2 = new DatagramPacket(b, b.length);
socket.receive(packet2);
System.out.println("收到广播消息:" + new String(packet2.getData(), 0, packet2.getLength()));
socket.close();
}
}
当用Java命令依次运行Server.java和Client.java后,客户端会发送广播和消息:“Hello UDP”到局域网内所有设备,并接收到服务器的广播消息:“Hello all”。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java Socket实现UDP编程浅析 - Python技术站