1.DatagramPacket
对于UDP通信上篇已经讲过是无连接的协议
对于UDP的发送以及接收用一个包装类DatagromPacket来进行包装
创建DatagromPacket对象,因为不仅有发送也有接收,两种的实现方式是不同的,对于接收,相对于发送,稍微要简单一些
接收端的构造方法只需要接收一个字节组来存放接收到的数据,而发送端的构造方法不但要接收存放了发送数据的字节数组,还需要指定发送端的IP地址和端口号
接下来讲解创建实例的方法
1.DatagromPacket(byte[ ] buf,int length)
显然,指定了封装数据字节数组和数据的大小,没有指定IP地址和端口号,这是一个接收端的构造方法
2.DatagromPacket(byte[ ] buf,int length,InetAddress addr,int port)
不仅指定了封装数据的字节数组和数据的大小,还指定了数据包的目标IP地址和端口号
3.DatagromPacket(byte[ ] buf,int offset ,int length)
在第一个构造方法上面加上了offset参数,该参数用于指定接收到的数据放在buf缓冲组是从offset处开始
4.DatagromPacket(byte[ ] buf,int offset ,int length,InetAddress addr,int port)
offset参数用于指定一个数组中发送数据的偏移量为offset,即从offset位置开始发送数据
对于DatagramPacket类常用的方法
1.InetAddress getAddress():该方法用于发送端或者接收端的IP地址,如果是发送端的DatagramPacket 对象,就返回接收端的IP地址,反之,就返回发送端的IP地址
2.int getPort():该方法用于返回发端或者接收端的端口号,如果是发送端的DatagramPacket对象就会返回接收端的接口号,反之,就返回发送端的接口号
3.byte[]getData():该方法用于返回发送或者接收的数据,如果是发送端的DatagramPacket对象就会返回将要发送的数据,反之,就返回接收到的数据
4.int getLength():该方法用于返回发送或者接收的数据的长度,如果是发送端的DatagramPacket对象就会返回将要发送的数据长度,反之,就返回接收到的数据长度
DatagramSocket
对于DatagramPacket可以看做是集装箱,但是只有集装箱是不可行的,还要有码头DatagramSocket就相当于是码头,使用DatagramSocket类的实例对象就可以发送和接收DatagramPacket数据包
有关于DatagramSocket的常用实例化
1、DatagramSocket():该构造方法用于创建发送端的DatagramSocket对象,在创建DatagramSocket对象时,并没有指定端口号,此时,系统会分配一个没有被其他网络程序所使用的端口号
2、DatagramSocket(int port):该构造方法既可以用于创建发送端的DatagramSocket对象,又可以创建发送端的DatagramSocket对象,在创建DatagramSocket对象时,必须要指定一个端口号,这样就可以监听指定的端口
3、DatagramSocket(int port,InetAddress addr):不仅指定了端口号,又指定了相关的IP地址,这种情况用于计算机上面有多块网卡的情况,由于计算机中针对不同的网卡会分配不同的IP,因此在创建DatagramSocket对象时需要通过指定ip地址来确定使用那块网卡进行通信
对于DatagramSocket类当中常用的使用方法
1、void recieve(DatagramPacket p):该方法用于将接收到的数据填充到DatagramPacket数据包当中,在接收到数据之前会一直处于阻塞状态,只有当接收到数据包时,该方法才会返回
2、void send(DatagramPacket p):该方法用于发送DatagramPacket数据包,发送的数据包当中包涵将要发送的数据,数据的长度,远程主机的IP地址以及端口号
3、void close():主要用于关Socket,释放资源
UDP网络程序
编写接收端程序
import java.net.*;
public class emp{
public static void mian(String [] args){
byte[ ]buf = new byte[1024];
DatagramSocket ds = new DatagramSocket(8954);
DatagramPacket dp = new DatagromPacket(buf,1024);
System.out.println("等待接受数据");
ds.receive(dp);
String str = new String(dp.getData(),0,dp.getLength())+"from"+dp.getAddress().getHostAddress()+":"+dp.getPort();
System.out.println(str);
ds.close();
}
}
编写发送端的数据
import java.net.*;
public class emp{
public static void mian(String [] args){
DatagramSocket ds = new DatagramSocket(3000);
String str ="Hello wrold!";
DatagramPacket dp = new DatagromPacket(str.getByte(),str.length(),InetAddress.getByName("localhost"),8954);
System.out.println("发送消息");
ds.send(dp);
ds.close();
}
}