步骤概述
DatagramSocket与DatagramPacket。
建立发送端,接收端。
建立数据包。
调用Socket的发送接收方法。
关闭Socket。
发送端与接收端是两个独立的运行程序。
常用方法
DatagramSocket类表示用来发送和接收数据报包的套接字。
DatagramSocket():构造数据报套接字并将其绑定到本地主机上任何可用的端口。
DatagramSocket(int port):创建数据报套接字并将其绑定到本地主机上的指定端口。
void receive(DatagramPacket p):从此套接字接收数据报包。
void send(DatagramPacket p):从此套接字发送数据报包。
void close():关闭此数据报套接字。
DatagramPacket类表示数据报包。
DatagramPacket(byte[] buf, int length, InetAddress address, int port):构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。
DatagramPacket(byte[] buf, int length):构造 DatagramPacket,用来接收长度为 length 的数据包。
InetAddress getAddress():返回某台机器的 IP 地址,此数据报将要发往该机器或者是从该机器接收到的。
byte[] getData():返回数据缓冲区。
int getLength():返回将要发送或接收到的数据的长度。
int getPort():返回某台远程主机的端口号,此数据报将要发往该主机或者是从该主机接收到的。
示例
客户端
/*
需求:通过udp传输方式,将一段文字数据发送出去。
定义一个udp发送端。
思路:
1.建立updsocket服务。
2.提供数据,并将数据封装到数据包中。
3.通过socket服务的发送功能,将数据包发出去。
4.关闭资源。
*/
import java.net.*;
class UdpSend{
public static void main(String[] args)throws Exception{
// 1.创建udp服务,通过DatagramSocket对象。
DatagramSocket ds=new DatagramSocket (10001); // 可以指定端口;
// 2.确定数据,并封装成数据包。
byte[] buf="udp demo...".getBytes();
DatagramPacket dp=
new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.0.106"),10000);
// 3.通过socket服务,将已有的数据包发送出去,通过send()方法。
ds.send(dp);
// 4.关闭资源。
ds.close();
}
}
服务端
/*
需求:定义一个应用程序,用于接收udp协议传输的数据并处理。
定义一个udp接收端。
思路:
1.定义udpsocket服务。通常会监听一个端口。其实就是给这个接收网络应用程序定义数字标识。
方便于明确那些数据过来该应用程序可以处理。
2.定义一个数据包,因为要存储接收到的字节数据。
因为数据包对象中有更多功能可以提取字节数据中的不同数据信息。
3.通过socket服务的receive()方法将收到的数据存入已定义好的数据包中。
4.通过数据包对象的特有功能。将这些不同的数据取出,打印在控制台上。
5.关闭资源。
*/
class UdpRece{
public static void main(String[] args)throws Exception{
// 1.创建udp socket服务,建立端点。只需要建立一次。
DatagramSocket ds=new DatagramSocket(10000); // 在while循环外,因为容易发生绑定异常(BindException),多次访问同一端口
while(true){ // 一直开启服务端服务,但不会是死循环,因为recevie()是阻塞式方法
// 2.定义数据包,用于存储数据。
byte[] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,buf.length);
// 3.通过服务的receive()方法收到数据存入数据包中。
ds.receive(dp); // 阻塞式方法
// 4.通过数据包的方法获取其中的数据。
String ip=dp.getAddress().getHostAddress();
String data=new String(dp.getData(),0,dp.getLength());
int port = dp.getPort();
System.out.println(ip+"..."+data+"..."+port);
}
// 5.关闭资源。
// ds.close();
}
}