首先我们要清楚:
1.DatagramSocket 和 DatagramPacket 两个类是 基于UDP 协议进行通信的包装类。
2.实现两个客户端通过 UDP协议通信,使用DatagramSocket 和 DatagramPacket类有如下几个步骤,分为客户端和服务端:
客户端:
1),实例化DatagramSocket类(带上指定端口),创建客户端
2),准备数据,数据是以字节数组发送的
3),打包数据,使用 DatagramPacket 类 + 服务器地址+ 端口
4),发送数据
5),关闭连接
代码演示:
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.*;
public class Client25 {
public static void main(String[] args) throws IOException {
//创建服务器(未加端口)
DatagramSocket udpClientSocket=new DatagramSocket();
//准备数据
String message="你好呀";
byte[] sendBuffer=message.getBytes("UTF-8");
//getBytes(String charsetName)
//使用命名的字符集将此 String编码为字节序列,将结果存储到新的字节数组中
//127.0.0.1
byte[] serverIP=new byte[4];
serverIP[0]=127;
serverIP[1]=0;
serverIP[2]=0;
serverIP[3]=1;
//getByAddress(byte[] addr)根据源ip地址来获取InetAddress对象
InetAddress serverAddress=InetAddress.getByAddress(serverIP);
//打包(发送的目的和端口)
DatagramPacket sendPacket=new DatagramPacket(sendBuffer,sendBuffer.length,serverAddress,9898);
//发送资源
udpClientSocket.send(sendPacket);
//接收对方回应的消息
//准备 容器接收
byte[] receiveBuffer=new byte[1024];
//封装成包(byte[] bytes,bytes.lenth)
DatagramPacket receivePacket=new DatagramPacket(receiveBuffer,receiveBuffer.length);
//接收,使用DatagramSocket实例的receive方法接收
udpClientSocket.receive(receivePacket);
//用String的构造方法进行转换成字符串
String responseMessage=new String(receivePacket.getData(),0,receivePacket.getLength(),"UTF-8");
System.out.println(responseMessage);
//关闭资源
udpClientSocket.close();
}
}
服务端
1),实例化DatagramSocket类+指定端口
2),准备接收的字节数组,封装 DatagramPacket
3),接受数据
4),解析数据
5),关闭连接
代码演示:
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class Server25 {
public static void main(String[] args) throws IOException {
//新建一个DatagramSocket+端口
DatagramSocket udpServerSocket=new DatagramSocket(9898);
while(true){
//准备接收容器
byte[] receiveBuffer=new byte[1024];
//封装成包 new DatagramPacket(byte[] b,int length)
DatagramPacket receivePacket=new DatagramPacket(receiveBuffer,receiveBuffer.length);
//等着客户来撩
udpServerSocket.receive(receivePacket);
InetAddress clientAddress=receivePacket.getAddress();
System.out.printf("我从%s:%d收到了消息%n",clientAddress.getHostAddress(),receivePacket.getPort());
System.out.printf("我一共收到了%d字节的数据%n",receivePacket.getLength());
//转成字符串
String message=new String(receivePacket.getData(),0,receivePacket.getLength(),"UTF-8");
//服务器端打印收到的字符串
System.out.println(message);
//准备容器
byte[] sendBuffer=message.getBytes("UTF-8");
//封装成包
DatagramPacket sendPacket=new DatagramPacket(sendBuffer,sendBuffer.length,clientAddress,receivePacket.getPort());
udpServerSocket.send(sendPacket);
}
}
}
测试结果:
服务器:客户端:
至此,通过udp协议实现的简单客户端和服务器就完成了,这里的IP用的是本机,客户端发送信息至本机服务器,服务器将接收到的信息再发送给客户端。.DatagramSocket 和 DatagramPacket 是基于udp协议通信的两个包装类,发送接受数据都要现将数据打包,才能进一步操作。
小结:通过对udp协议的学习,会用udp协议实现简单的客户端和服务端,但是对于类的理解和使用仍然不够熟练,还需要勤加练习,网络协议是学习java非常重要的一部分内容,所以在以后的学习中,对于这部分知识还要多花时间理解和巩固。