前面的TCP是有可靠的,有序的。现在看看UDP,UDP是不可靠的,无序的。
现在看看实现:
这里我也用两个类模拟了客户端与服务端,
现在直接看下代码:
UDPServer.java:
package com.socket.udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
/**
* UDP 服务端
*
* @author lolli
*
*/
public class UDPServer {
public static void main(String[] args) {
try {
// 创建服务器端的DatagramSocket,并指定端口
DatagramSocket datagramSocket = new DatagramSocket(8888);
System.out.println("***** 启动服务器,等待客户端的连接请求 ******");
byte[] data = new byte[2048];
// 创建数据报,用户接受客户端请求的数据
DatagramPacket datagramPacket = new DatagramPacket(data, data.length);
// 接收客户端请求的数据(在接收到数据之前一直处于阻塞状态)
datagramSocket.receive(datagramPacket);
// 获取请求的数据,并转成String打印出来
String clientData = new String(data, 0, datagramPacket.getLength());
System.out.println("我是服务端,客户端请求的数据为:" + clientData);
// *** 给客户端进行相应 ***
// 定义客户端的地址
InetAddress inetAddress = datagramPacket.getAddress();
int port = datagramPacket.getPort();
byte[] backData = "我接受到了客户端的数据,你好!".getBytes();
// 创建数据包,给客户端响应数据
DatagramPacket backDatagramPacket = new DatagramPacket(backData, backData.length, inetAddress, port);
// 给客户端发送数据
datagramSocket.send(backDatagramPacket);
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
再看看客户端:
UDPClient.java:
package com.socket.udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
/**
* UDP 客户端
* @author lolli
*
*/
public class UDPClient {
public static void main(String[] args) {
try {
// 定义服务器地址
InetAddress inetAddress = InetAddress.getByName("localhost");
byte[] data = "我是客户端,hello".getBytes();
// 创建数据报,准备数据
DatagramPacket datagramPacket = new DatagramPacket(data, data.length, inetAddress, 8888);
// 创建一个DatagramSocket
DatagramSocket datagramSocket = new DatagramSocket();
// 发送请求
datagramSocket.send(datagramPacket);
// *** 接收服务端响应回来的数据 ***
byte[] resData = new byte[2048];
// 创建数据报,用户接受客户端请求的数据
DatagramPacket resDatagramPacket = new DatagramPacket(resData, resData.length);
// 接收客户端请求的数据(在接收到数据之前一直处于阻塞状态)
datagramSocket.receive(resDatagramPacket);
// 获取请求的数据,并转成String打印出来
String serverData = new String(resData, 0, resDatagramPacket.getLength());
System.out.println("我是客户端,服务端响应的数据为:" + serverData);
datagramSocket.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
然后再运行看看结果。
同样的,我们也要先启动客户端,在启动客户端
服务端控制台:
客户端控制台: