- UDP通信原理
- 一. 定义
- DatagramSocket类简单介绍
- DatagramPacket类简单介绍
- 二. 发送数据的步骤
- 三. 接受数据的步骤:
-
UDP协议是一种不可靠的网络协议,它在通信的两端各建立了一个Socket对象,但是这两个Socket只是发送,接收数据的对象,
-
因此对于基于UDP协议的通信双方而言,没有所需的客户端和服务器的概念
-
Java提供了DatagramSocket类作为基于UDP协议的Socket,以及数据包类DatagramPacket类
构造方法:
-
创建发送端的Socket对象(DatagramSocket)
DatagramSocket() -
创建数据,并把数据打包
DatagramPacket(byte[] buf,int length,InetAddress address,int port) -
调用DatagramSocket对象的方法发送数据
void send(DatagramPacket p);//发送数据报包 -
关闭发送端
void close();关闭此数据报套接字
- 代码内容实现:(注意端口号)
package Demo;
import java.io.IOException;
import java.net.*;
public class SendDemo {
public static void main(String[] args) throws IOException {
//创建发送端的Socket对象(DatagramSocket)
DatagramSocket ds = new DatagramSocket();
//创建数据,并把数据打包
//DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)
//构造用于发送长度的分组数据报包 length具有偏移 ioffset指定主机上到指定的端口号
byte[] buf ="hello,udp,我来了".getBytes();
int length = buf.length;
InetAddress address = InetAddress.getByName("192.168.137.1");
int port=1111;
DatagramPacket dp = new DatagramPacket(buf,length,address,port);
//调用DatagramSocket对象的方法发送数据,void send(DatagramPacket p);发送数据报包
ds.send(dp);
//关闭发送端
ds.close();
}
}
三. 接受数据的步骤:
-
创建接收端的Socket对象(DatagramSocket)
DatagramSocket(int port) -
创建一个数据包,用于接收数据
DatagramPocket(byte[] but,int length) -
调用DatagramSocket对象的方法接收数据
void receive(DatagramPacket p) -
解析数据包,并把数据在控制台显示
byte[] getData()返回数据缓冲区
int getLength()返回要发送的数据的长度或接收到的数据的长度。 -
关闭接收端
void close()
- 代码内容实现:(注意端口号)
package Demo;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class ReceiveDemo {
public static void main(String[] args) throws IOException {
//创建接收端的Socket对象(DatagramSocket)
DatagramSocket dg = new DatagramSocket(1111);
//创建一个数据包,用于接收数据
byte[] bytes = new byte[1024];//一次接收1024个字节数据足以够
int length = bytes.length;//数据的长度
DatagramPacket dp = new DatagramPacket(bytes, length);
//调用DatagramSocket对象的方法接收数据
dg.receive(dp);
//解析数据包,并把数据在控制台显示
byte[] data = dp.getData();//返回数据缓冲区
int len = dp.getLength();//返回要发送的数据的长度或接收到的数据的长度
String s = new String(data, 0, len);//利用字符串的形式输出
System.out.println(s);//直接输出s,是因为s.toString()方法重写了
//关闭接收端
dg.close();
}
}
- 步骤输出的内容(我之前将发送和接收端口号弄为一致,相当于我给自己发送东西):



