UDP通信
特点:无连接、不可靠通信。
不事先建立连接;发送端每次把要发送的数据(限制在64KB内)、接收端IP、等信息封装成一个数据包,发出去就不管了。
java提供了一个java.net.DatagramSocket类来实现UDP通信。
一发一收
客户端Client
DatagramSocket socket = new DatagramSocket(); //创建客户端对象,此时要抛出异常
创建数据包对象封装要发出去的数据(首先来看DatagramPacket的源码)
public DatagramPacket(byte buf[], int length,
InetAddress address, int port)
总共有四个参数,内容如下↓
参数一:封装要发出去的数据,转成字节数组
参数二:发送出去的数据大小(字节个数)
参数三:服务端的IP地址(找到服务端主机)
参数四:服务端的端口
定义一个字符串,并使用getBytes()方法,转变成一个字节数组
定义整形变量记录字节个数
获取本机地址
(端口可以自己定义)
byte[] bytes = "我是一个客户端,ABC123adc234".getBytes(); int length = bytes.length; InetAddress address = InetAddress.getLocalHost();
创建数据包对象
DatagramPacket packet = new DatagramPacket(bytes,length,address,6666);
开始正式发送这个数据包的数据出去(最后可以释放一下资源)
socket.send(packet); System.out.println("客户端数据发送完毕~~"); socket.close();
整体代码
public class Client {
public static void main(String[] args) throws Exception{
//1.创建客户端对象
DatagramSocket socket = new DatagramSocket();
//2.创建数据包对象封装要发出去的数据
// public DatagramPacket(byte buf[], int length,
// InetAddress address, int port)
/*
参数一:封装要发出去的数据,转成字节数组
参数二:发送出去的数据大小(字节个数)
参数三:服务端的IP地址(找到服务端主机)
参数四:服务端的端口
*/
byte[] bytes = "我是一个客户端,ABC123adc234".getBytes();
int length = bytes.length;
InetAddress address = InetAddress.getLocalHost();
DatagramPacket packet = new DatagramPacket(bytes,length,address,6666);
//3.开始正式发送这个数据包的数据出去了
socket.send(packet);
System.out.println("客户端数据发送完毕~~");
socket.close(); // 释放资源
}
}
服务端Server
创建的端口一定要和客户端的端口一致,否则无法接收数据
创建服务端对象 注册端口 DatagramSocket socket = new DatagramSocket(6666);
创建数据包对象,用于接收数据
byte[] buffer = new byte[1024 * 64]; //64KB , 一包数据最大就是64KB DatagramPacket packet = new DatagramPacket(buffer,buffer.length);
使用数据包来接收客户端发过来的数据(服务端.receive(包)方法)
socket.receive(packet);
从字节数组中把接收到的数据直接打印出来
因为字节数组是64KB,如果客户端发送的数据没有那么大,会导致多倒一些东西出来,所以应该实现读取多少,倒出多少
int len = packet.getLength(); String s = new String(buffer,0,len); System.out.println(s);
另外,也可以获取客户端的IP地址和端口(最后释放一下资源)
System.out.println("客户端的IP地址:" + packet.getAddress().getHostAddress()); System.out.println("客户端的端口:" + packet.getPort());socket.close();
整体代码
public class Server {
public static void main(String[] args) throws Exception {
System.out.println("-----服务端启动-----");
//1.创建服务端对象 注册端口
DatagramSocket socket = new DatagramSocket(6666);
//2.创建数据包对象,用于接收数据
byte[] buffer = new byte[1024 * 64]; //64KB , 一包数据最大就是64KB
DatagramPacket packet = new DatagramPacket(buffer,buffer.length);
//3.使用数据包来接收客户端发过来的数据
socket.receive(packet);
//4.从字节数组中,把接收到的数据直接打印出来
// 接收多少就倒出多少
//获取本次数据包接收了多少数据
int len = packet.getLength();
String s = new String(buffer,0,len);
System.out.println(s);
System.out.println("客户端的IP地址:" + packet.getAddress().getHostAddress());
System.out.println("客户端的端口:" + packet.getPort());
socket.close();
}
}