说明:UTP是面向无连接的,不可靠的协议,即传输数据时不会确定对方是否在线,优点是效率高。
DatagramSocket & DatagramPacket
DatagramSocket是使用UDP协议的Socket,它的作用是接收和发送数据包;
DatagramPacket是DatagramSocket发送和接收的数据包对象,两者需配合使用
DatagramSocket 方法
DatagramSocket():无参构造方法;
DatagramSocket(int port):带端口号的构造方法;
send(DatagramPacket p):发送一个数据包
receive(DatagramPacket p):接收一个数据包
close():关闭通道
DatagramPacket 方法
DatagramPacket(byte buf[], int length,InetAddress address, int port):指定一个字节数组,长度,IP地址和端口号的数据包
DatagramPacket(byte buf[], int length):指定一个字节数组和长度的数据包
入门案例
客户端:发送指定IP和端口的数据包;
如果不发给本机,IP地址应该设置为接收方的IP,当然双方应该是能Ping通的,否则接收不到
import java.io.IOException;
import java.net.*;
public class EssayClient {
public static void main(String[] args) throws IOException {
// 创建客户端的DatagramSocket对象
DatagramSocket dgs = new DatagramSocket();
// 发送Hello
byte[] data = "Hello!".getBytes();
// 获取本地的InetAddress对象
InetAddress localhost = InetAddress.getByName("192.168.13.28");
// 将要发送的数据,IP信息,端口号封装成一个数据包
DatagramPacket dgp = new DatagramPacket(data, data.length, localhost, 10000);
// 发送数据
dgs.send(dgp);
// 关闭通道
dgs.close();
}
}
服务端:指定IP和端口,接收数据包
需要注意的是,这里的端口需要和客户端那边设置的数据包端口号一致,否则也接收不到
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class EssayServer {
public static void main(String[] args) throws IOException {
// 创建接收端的DatagramSocket对象,指定端口号
DatagramSocket dgs = new DatagramSocket(10000);
// 创建一个接收数据的字节数组
byte[] data = new byte[1024];
// 创建一个数据包,数据包大小为1K
DatagramPacket dgp = new DatagramPacket(data, data.length);
// 接收数据包
dgs.receive(dgp);
// 获取接收到的数据包信息
byte[] dataByteArray = dgp.getData();
// 获取接收到的数据包字节长度
int length = dgp.getLength();
// 将信息转为字符串
String message = new String(dataByteArray, 0, length);
// 关闭通道
dgs.close();
System.out.println("message = " + message);
}
}
另外,启动程序时需要先启动服务端,再启动客户端;还需要注意的是,客户端如果没有接收到数据包会一直阻塞,下图是我更改了服务端的端口号后运行的结果