目录
利用DatagramSocket发送和接收UDP数据报
DatagramPacket构造方法说明
利用DatagramPacket和Datagramsocket简单实现服务器和客户端的通信
UDP协议通讯的用户状态跟踪
1、Java语言中使用数据报(Datagram)进行基于UDP的网络编程;
2、数据报(Datagram)如同邮件系统,不能保证可靠的传输,而面向链接的TCP就好比打电话,双方能肯定对方接受到了信息;
3、Java API中java.net包提供了DatagramSocket和DatagramPacket两个类,用来支持数据报通信;
4、DatagramSocket用于在程序之间建立传送数据报的通信连接;
5、DatagramPacket则用来表示一个数据报;
6、用数据报方式进行网络编程时,无论客户端还是服务器端都要建立一个DatagramSocket对象,用来接收或发送数据报,然后使用DatagramPacket类对象作为传输数据的载体;
DatagramPacket相当于一个被邮寄的包裹,上面写着收货人的地址,包裹里是所要传递的数据
1、DatagramPacket(byte[] buf,int length):以一个字节数组来创建DatagramPacket对象,该对象的作用是接收DatagramSocket中的数据。相当于一个缓冲池的作用
2、DatagramPacket(byte buf[], int offset, int length) {} :一个字节的数组来创建DatagramPacket对象,其中 int offset 代表偏移量,int length代表长度(也可以说是池子的容量)
3、 DatagramPacket(byte buf[], int offset, int length, InetAddress address, int port) :创建一个用于发送的DatagramPacket对象,指定发送buf数组中从offset开始,总共length个字节。
4、DatagramPacket(byte[] buf, int length, InetAddress addr, int port):以一个包含数据的数组来创建DatagramPacket对象,创建该DatagramPacket对象时还指定了IP地址和端口--这就决定了该数据报的目的地。
1、创建客户端
1)创建客户端 DatagramSocket 类+指定端口
2)准备数据 字节数组
3) 打包 DatagramPacket +服务器地址 以及端口
4) 发送
5) 释放资源
2、服务器端
1)创建服务器 DatagramSocket 类+指定端口
2)准备接受的容器 字节数组 封装 DatagramPacket
3)包接收资源
4) 分析
5) 释放资源 简单来说就是服务器先挖一个DatagramPacket的邮箱,时刻准备着接受邮件,客户端这边准备好所要邮寄的东西,写好所要邮寄的地址(DatagramPacket+服务器地址+端口)不然邮递员不知道把邮件往那发送。
import java.io.IOException;
import java.net.*;
/**
* 发送数据到客户端
*/
public class Server {
public static void main(String[] args) throws IOException {
//创建DatagramSocket对象
DatagramSocket socket = new DatagramSocket(5000);
//定义缓存
byte[] buffer = new byte[1024];
//创建DatagramPacket对象
DatagramPacket receivePacket = new DatagramPacket(buffer, 0, buffer.length);
//接收数据报,存储到DatagramPacket
socket.receive(receivePacket);
//获取DatagramPacket对象对应的数据
String s = new String(receivePacket.getData(), 0, receivePacket.getLength());
//ip地址和窗口
String hostAddress = receivePacket.getAddress().getHostAddress();
int port = receivePacket.getPort();
//打印
System.out.println(hostAddress + ":" + port + "发送来的数据为:" + s);
}
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class Client {
public static void main(String[] args) throws IOException {
//创建DatagramSocket对象
DatagramSocket socket = new DatagramSocket(3456);
//数据要发送的字节数组
byte[] data = "hello world".getBytes();
//接收者的IP地址 对应的InetAddress对象
InetAddress address = InetAddress.getByName("127.0.0.1");
//接收者的端口
int port = 5000;
//创建DatagramPack(数据报)
DatagramPacket sendPacket = new DatagramPacket(data, 0, data.length, address, port);
//发送
socket.send(sendPacket);
System.out.println("数据发送完毕");
}
}
1、和Socket不同,UDP是一个典型的非状态协议(即UDP通讯的两个节点无法获取对方的在线状态),因此在实时通讯领域判定客户端是否掉线就不及Socket方式方便(Socket方式通讯时一端掉线另一端会直接抛出异常)
2、在这种情况下,服务器要想获取客户端的在线信息就需要完成定期问询,如果在规定时间内能够得到客户端自动反馈的问询结果则说明客户端依旧在线,反之则客户端离线(即心跳信息)