UDP编程
1)不需要建立连接通道
2)数据大小有限制
3)不可靠连接---->传输速度快!
用到的类和类中方法
Socket类
此类实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器间通信的端点。 (套接字当作手机理解)
DatagramSocket类
此类表示用来发送和接收数据报包的套接字。
构造方法:
public DatagramSocket(int port,InetAddress laddr) throws SocketException
创建数据报套接字,将其绑定到指定的本地地址。
port - 要使用的本地端口
laddr - 要绑定的本地地址
public DatagramSocket() throws SocketException
构造数据报套接字并将其绑定到本地主机上任何可用的端口。套接字将被绑定到通配符地址,IP 地址由内核来选择。
public DatagramSocket(int port) throws SocketException
创建数据报套接字并将其绑定到本地主机上的指定端口。
发送方法
public void send(DatagramPacket p)throws IOException
从此套接字发送数据报包。
p - 将要发送的 DatagramPacket。
接收方法:
public void receive(DatagramPacket p)throws IOException
从此套接字接收数据报包。
p - 要放置传入数据的 DatagramPacket。
关闭方法:
public void close()
关闭此数据报套接字。
DatagramPacket类
此类表示数据报包。
构造方法
public DatagramPacket(byte[] buf,int offset,int length,InetAddress address,int port)
构造数据报包,用来将长度为 length 偏移量为 offset 的包发送到指定主机上的指定端口号。length 参数必须小于等于 buf.length。
buf - 包数据。
offset - 包数据偏移量。
length - 包数据长度。
address - 目的地址。
port - 目的端口号。
public DatagramPacket(byte[] buf,int length)
构造 DatagramPacket,用来接收长度为 length 的数据包。 length 参数必须小于等于 buf.length。
buf - 保存传入数据报的缓冲区。
len - 要读取的字节数。
常用方法:
public InetAddress getAddress()
返回某台机器的 IP 地址,此数据报将要发往该机器或者是从该机器接收到的
public byte[] getData()
返回数据缓冲区。接收到的或将要发送的数据从缓冲区中的偏移量 offset 处开始,持续 length 长度。
public int getLength()
返回将要发送或接收到的数据的长度。
发送端的开发步骤:
1)创建发送端的Socket对象
2)创建数据,并打包
3)调用当前发送端Socket对象中的发送的方法
4)关闭资源
public static void main(String[] args) throws IOException {
///1)创建发送端的Socket对象
//构造数据报套接字并将其绑定到本地主机上任何可用的端口
DatagramSocket ds = new DatagramSocket() ;
//2)创建数据,并打包
//DatagramPacket 数据报包
//有数据
byte[] bys = "hello,udp,我来了".getBytes() ;
//获取包数据长度
int len = bys.length ;
//获取ip地址对象
InetAddress address = InetAddress.getByName("192.168.10.1") ;
//指定端口号
int port = 10086 ;
DatagramPacket dp =new DatagramPacket(bys, 0, len, address, port) ;
//3)调用当前发送端Socket对象中的发送的方法
ds.send(dp);
//4)关闭资源
ds.close();
}
Udp编程的接收端 开发步骤:
1)创建Socket对象
2)创建一个数据报包(接收容器)
3)调用Socket对象中的接收的方法
4)解析实际传递的数据
5)将解析的数据(ip,数据)展示在控制台上
6)关闭资源
public static void main(String[] args) throws IOException {
//1)创建Socket对象
DatagramSocket ds = new DatagramSocket(10086);//创建数据报套接字并将其绑定到本地主机上的指定端口。
//2)创建一个数据报包(接收容器)
byte[] bys = new byte[1024] ;
int len = bys.length ;
DatagramPacket dp = new DatagramPacket(bys, len) ;
//3)调用Socket对象中的接收的方法
ds.receive(dp);//阻塞式方法
InetAddress address = dp.getAddress() ;
String ip = address.getHostAddress() ; //获取ip地址文本形式
//4)解析实际传递的数据
byte[] bys2 = dp.getData() ; //获取缓冲中实际数据(从接收容器中获取)
int len2 = dp.getLength() ;//从接收容器中获取包的实际长度
String data = new String(bys2, 0, len2) ;
System.out.println("当前接收到的数据是:"+data+",来自于"+ip);
//6)关闭资源
ds.close();
}
先运行接收端,在运行发送端
注意:
多次运行接收端会报异常:java.net.BindException: Address already in use: Cannot bind