UDP协议(User Datagram Protocol)
Internet 协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,User Datagram Protocol)。UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。
Internet 的传输层有两个主要协议,互为补充。无连接的是 UDP,它除了给应用程序发送数据包功能并允许它们在所需的层次上架构自己的协议之外,几乎没有做什么特别的事情。面向连接的是 TCP,该协议几乎做了所有的事情。
Java实现
发送端:send
接收端:receive
正常按照现实生活中理解的话,发送端先发出去。
但是,程序中刚好相反,是先启动接收端。
(可以理解为,传输的过程,是接收方先买了个快递,焦急等待着发送端给它发送然后拿到自己手里的过程)。
发送端实现步骤:
1.需要一个socket对象----DatagramSocket(发送端和接收端用的都是这个对象)
UDP协议不需要创建连接,但是需要一个桥梁(Socket),需要的是DatagramSocket对象,这个对象可以在底层帮我们建立一条管道,把数据发送出去。每个协议需要的Socket对象都不太一样,因为每个不同的协议的底层实现都不一样,但是底层不用我们去实现,因为Java已经帮我们封装好了,所以我们直接创建Socket对象即可。
2.发送的数据需要打成一个包—DatagramPacket对象
packet对象创建时需要5个参数:
- 发送的真实数据, byte[] 字节型
- 从这个数组的哪里结束 0
- 发送字节的长度 末尾 length
- 接收端的ip地址
- 接收端的开放端口号
找本机IP地址:(默认为localhost)
3.Socket对象发送出去
UDP发送端代码:
package send;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.Scanner;
public class Send {
public static void main(String[] args) {
System.out.println("==send端==");
try {
//1.需要一个socket对象
DatagramSocket socket = new DatagramSocket();
//2.发送的数据需要打成一个包
//packet对象创建时需要5个参数:
// 1. 发送的真实数据, byte[]
// 2. 从这个数组的哪里结束 0
// 3. 发送字节的长度 末尾 length
// 4. 接收端的ip地址
// 5.接收端开放的端口号
Scanner input = new Scanner(System.in);
System.out.println("跟接收端说点什么吧:");
String message = input.nextLine();
byte[] bMsg = message.getBytes();//将字符串转化成byte类型数组
InetAddress ip = InetAddress.getByName("localhost");//将字符串转化为IP对象
int port = 9999;//端口号
DatagramPacket packet = new DatagramPacket(bMsg,0,bMsg.length,ip,port);
//3.Socket对象发送出去
socket.send(packet);
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
接受端实现步骤:
1.需要创建一个socket对象—DatagramSocket
必须给定接收端的端口号,监听端口是否有数据进来。
2.需要准备一个空的数据包进行接收—DatagramPacket对象
空数据包需要三个参数
- 一个空的数组
- 告知用数组的哪个位置开始接收
- 用数组的多长进行接收
3.接收数据
4.展示、使用数据
按照接收到的有效字节个数来构建。
UDP接收端代码:
package receive;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class Receive {
public static void main(String[] args) {
System.out.println("==receive==");
try {
// 1.需要创建一个socket对象—DatagramSocket
DatagramSocket socket = new DatagramSocket(9999);
//2.需要准备一个空的数据包进行接收
byte[] b = new byte[100];
DatagramPacket packet = new DatagramPacket(b,0,b.length);
// 空数据包需要三个参数
// 1.一个空的数组
// 2.告知用数组的哪个位置开始接收
// 3.用数组的多长进行接收
// 3.接收数据
socket.receive(packet);//参数不是真正的参数含义,这个参数是为了接收数据,
//这个参数的含义更像是返回值,把接受的数据放在参数里作为返回值.
// 4.展示、使用数据
String value = new String(b,0,packet.getLength());//按照接收到的有效字节个数来构建
System.out.println("接收到的数据:"+value);
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
测试
先启动接收端,再启动发送端。