前面的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();
-
}
-
}
-
}
然后再运行看看结果。
同样的,我们也要先启动客户端,在启动客户端
服务端控制台:
客户端控制台: