服务端Server.java:
package com.sknomy.udp;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/**
* UDP通讯的服务端
* @author sknomy
*
*/
public class Server {
public static void main(String[] args) {
try {
DatagramSocket socket = new DatagramSocket(8088);
/*
* 接收客户端发送过来的数据
* 1.先准备一个接收数据用的空包
* 2.通过Socket接收数据
* 当接受完毕后,该接收包会有一些变化
* (1):包中就含有客户端发送过来的数据
* (2):包中还记录了客户端的地址信息
* (3):包也知道实际接收的读取长度
*/
//用于存放接收字节用的数组
byte[] data = new byte[100];
/*
* 将自己数组设置到包中后,当接收到数据以后,就会存入到这个数组中
*/
DatagramPacket packet = new DatagramPacket(data, data.length);
/*
* 接收数据
* 该方法是一个阻塞方法,直到一个客户端发送数据过来,这里才会将
* 数据存入并返回
*/
socket.receive(packet);
/*
* 获取接收的数据
* 包提供了获取数据的方法:
* byte[] getDate()
* 该方法获取的数组就是上面的data数组
* 当我们不能直接访问该数据时,可以通过包获取。
*/
String message = new String(
packet.getData(),
0,
packet.getLength(), //获取实际接收的字节量
"utf-8"
);
System.out.println("客户端说:"+message);
/*
* 回复客户端
*/
//装备要发送的数据
message = "你好客户端!";
data = message.getBytes("utf-8");
/*
* 准备地址信息(服务端的地址)
* 1.服务端地址
* 2.服务端端口
* 不同的通讯协议端口之间不冲突
* 我们可以在一台机器上同时开启一个TCP的8088端口和一个UDP协议的8088端口.
*/
InetAddress address = packet.getAddress();
int port = packet.getPort();
//打包
packet = new DatagramPacket(
data, //要发送的数据
data.length, //发送多少字节
address, //地址信息
port //端口信息
);
//发送
socket.send(packet);
//不再使用时应当关闭Socket释放资源
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
客户端Client.java:
package com.sknomy.udp;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/**
* UPD通讯的客户端
* @author sknomy
*
*/
public class Client {
public static void main(String[] args) {
try {
//封装了UDP通讯的Socket
DatagramSocket socket = new DatagramSocket();
//装备要发送的数据
String message = "你好服务端!";
byte[] data = message.getBytes("utf-8");
/*
* 准备地址信息(服务端的地址)
* 1.服务端地址
* 2.服务端端口
* 不同的通讯协议端口之间不冲突
* 我们可以在一台机器上同时开启一个TCP的8088端口和一个UDP协议的8088端口.
*/
InetAddress address = InetAddress.getByName("localhost");
int port = 8088;
//打包
DatagramPacket packet = new DatagramPacket(
data, //要发送的数据
data.length, //发送多少字节
address, //地址信息
port //端口信息
);
//发送
socket.send(packet);
/*
* 接收服务端发送过来的数据
*/
//用于存放接收字节用的数组
data = new byte[100];
/*
* 将自己数组设置到包中后,当接收到数据以后,就会存入到这个数组中
*/
packet = new DatagramPacket(data, data.length);
/*
* 接收数据
* 该方法是一个阻塞方法,直到一个客户端发送数据过来,这里才会将
* 数据存入并返回
*/
socket.receive(packet);
/*
* 获取接收的数据
* 包提供了获取数据的方法:
* byte[] getDate()
* 该方法获取的数组就是上面的data数组
* 当我们不能直接访问该数据时,可以通过包获取。
*/
message = new String(
packet.getData(),
0,
packet.getLength(), //获取实际接收的字节量
"utf-8"
);
System.out.println("服务端说:"+message);
//不再使用时应当关闭Socket释放资源
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}