●UDP是一种无连接、不可靠传输的协议。
●将数据源IP、目的地IP和端口以及数据封装成数据包,大小限制在64KB内,直接发送出去即可。
构造器 | 说明 |
---|---|
public DatagramPacket(byte[] buf, int length, InetAddress address, int port) | 创建发送端数据包对象 |
buf:要发送的内容,字节数组 | |
length:要发送内容的字节长度 | |
address:接收端的IP地址对象 | |
port:接收端的端口号 | |
public DatagramPacket(byte[] buf, int length) | 建接收端的数据包对象 |
buf:用来存储接收的内容 | |
length:能够接收内容的长度 |
方法 | 说明 |
---|---|
public int getLength() | 获得实际接收到的字节个数 |
构造器 | 说明 |
---|---|
public DatagramSocket() | 创建发送端的Socket对象,系统会随机分配一个端口号。 |
public DatagramSocket(int port) | 创建接收端的Socket对象并指定端口号 |
方法 | 说明 |
---|---|
public void send(DatagramPacket dp) | 发送数据包 |
public void receive(DatagramPacket p) | 接收数据包 |
/**
发送端 一发 一收
*/
public class ClientDemo01 {
public static void main(String[] args) throws Exception {
System.out.println("=====客户端启动======");
// 1、创建发送端对象:发送端自带默认的端口号(人)
DatagramSocket socket = new DatagramSocket(6666);
// 2、创建一个数据包对象封装数据(韭菜盘子)
/**
public DatagramPacket(byte buf[], int length,
InetAddress address, int port)
参数一:封装要发送的数据(韭菜)
参数二:发送数据的大小
参数三:服务端的主机IP地址
参数四:服务端的端口
*/
byte[] buffer = "韭菜啊韭菜".getBytes();
DatagramPacket packet = new DatagramPacket( buffer, buffer.length,
InetAddress.getLocalHost() , 8888);
// 3、发送数据出去
socket.send(packet);
socket.close();
}
}
/**
接收端
*/
public class ServerDemo02 {
public static void main(String[] args) throws Exception {
System.out.println("=====服务端启动======");
// 1、创建接收端对象:注册端口(人)
DatagramSocket socket = new DatagramSocket(8888);
// 2、创建一个数据包对象接收数据(韭菜盘子)
byte[] buffer = new byte[1024 * 64];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
// 3、等待接收数据。
socket.receive(packet);
// 4、取出数据即可
// 读取多少倒出多少
int len = packet.getLength();
String rs = new String(buffer,0, len);
System.out.println("收到了:" + rs);
// 获取发送端的ip和端口
String ip =packet.getSocketAddress().toString();
System.out.println("对方地址:" + ip);
int port = packet.getPort();
System.out.println("对方端口:" + port);
socket.close();
}
}
●需求:客户端实现步骤
①创建DatagramSocket对象(发送端对象)---------------------------------------->扔韭菜的人
②创建DatagramPacket对象封装需要发送的数据(数据包对象)----------------> 韭菜盘子
③使用DatagramSocket对象的send方法传入DatagramPacket对象 -------->开始抛出韭菜
④释放资源
●需求:接收端实现步骤
①创建DatagramSocket对象并指定端口(接收端对象)------------------------->接韭菜的人
②创建DatagramPacket对象接收数据(数据包对象)------------------------------->韭菜盘子
③使用DatagramSocket对象的receive方法传入DatagramPacket对象 ----->开始接收韭菜
④释放资源
①UDP发送端和接收端的对象是哪个?
●public DatagramSocket():创建发送端的Socket对象
●public DatagramSocket(int port):创建接收端的Socket对象
②数据包对象是哪个?
●DatagramPacket
③如何发送、接收数据包
使用DatagramSocket的如下方法:
●public void send(DatagramPacket dp):发送数据包
●public void receive(DatagramPacket dp) :接收数据包
需求:
●使用UDP通信方式开发接收端和发送端。
分析:
①发送端可以一直发送消息。
②接收端可以不断的接收多个发送端的消息展示。
③发送端输入了exit则结束发送端程序。
●需求:客户端实现步骤
①创建DatagramSocket对象(发送端对象)------------------------------------->扔韭菜的人
②使用while死循环不断的接收用户的数据输入,如果用户输入的exit则退出程序
③如果用户输入的不是exit, 把数据封装成DatagramPacket --------------------> 韭菜盘子
④使用DatagramSocket对象的send方法将数据包对象进行发------------> 开始抛出韭菜
⑤释放资源
●需求:接收端实现步骤
①创建DatagramSocket对象并指定端口(接收端对象)---------------------->接韭菜的人
②创建DatagramPacket对象接收数据(数据包对象)---------------------------->韭菜盘子
③使用while死循环不断的进行第4步
④使用DatagramSocket对象的receive方法传入DatagramPacket对象–>开始接收韭菜
/**
发送端 多发 多收
*/
public class ClientDemo01 {
public static void main(String[] args) throws Exception {
System.out.println("=====客户端启动======");
// 1、创建发送端对象:发送端自带默认的端口号(人)
DatagramSocket socket = new DatagramSocket(7777);
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("请说:");
String msg = sc.nextLine();
if("exit".equals(msg)){
System.out.println("离线成功!");
socket.close();
break;
}
// 2、创建一个数据包对象封装数据(韭菜盘子)
byte[] buffer = msg.getBytes();
DatagramPacket packet = new DatagramPacket( buffer, buffer.length,
InetAddress.getLocalHost() , 8888);
// 3、发送数据出去
socket.send(packet);
}
}
}
/**
接收端
*/
public class ServerDemo02 {
public static void main(String[] args) throws Exception {
System.out.println("=====服务端启动======");
// 1、创建接收端对象:注册端口(人)
DatagramSocket socket = new DatagramSocket(8888);
// 2、创建一个数据包对象接收数据(韭菜盘子)
byte[] buffer = new byte[1024 * 64];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
while (true) {
// 3、等待接收数据。
socket.receive(packet);
// 4、取出数据即可
// 读取多少倒出多少
int len = packet.getLength();
String rs = new String(buffer,0, len);
System.out.println("收到了来自:" + packet.getAddress() +", 对方端口是" + packet.getPort() +"的消息:" + rs);
}
}
}
●接收端只负责接收数据包,无所谓是哪个发送端的数据包