UDP就像港口与港口之间运送货物,数据报包对货物进行打包,套接字就好像运送货物的港口,另外发送货物与接收货物需要指定货物从哪来,也就是IP和端口。
DatagramPacket的构造方法
DatagramPacket(byte[ ] buf,int length) | 用于接收数据包,指定数据的数组名及数据的大小 |
DatagramPacket(byte[ ] buf,int length,InetAddress addr,int port) | 用于发送端,指定了数据的大小,并指定了数据包的IP地址以及端口号 |
DatagramPacket(byte[ ] buf,int offset,int length) | 用于接收数据包,放到缓冲区数组时从offset处开始 |
DatagramPacket(byte[ ] buf,int offset,int length,InetAddress addr,int port) | 用于发送数据包,发送时从offset位置开始发送数据。 |
DatagramPacket类的常用方法
InetAddress getAddress() | 用于获取DatagramPacket的IP地址,如果是发送端的DatagramPacket对象,就返回接收端的IP地址 反之,就返回发送端的IP地址 |
int getPort() | 用于获得端口,如果是发送端的DatagramPacket就返回接收端的端口号,反之,就返回发送端的端口号 |
Byte[ ] getData() | 返回数据报数据,如果是发送端的DatagramPacket对象,就返回将要发送的数据,反之,就返回接收到的数据 |
int getLength() | 获得数据包的长度,如果是发送端的DatagramPacket对象,返回将要发送的数据长度,反之,就返回接收到的数据长度。 |
DatagramSocket类的构造方法
DatagramSocket() | 创建发送端的DatagramSocket对象,如果没有分配指定的端口号,系统还会自动分配端口号 |
DatagramSocket(int port) | 创建接收端或发送端的DatagramSocket对象,创建接收端的对象时,必须指定一个端口号,这样就可以监听这个端口 |
DatagramSocket(int port,InetAddress addr) | 适用于多网卡的情况,通过IP确定使用哪块网卡 |
DatagramSocket常用的方法
void receive(DatagramPacket p) | 该方法用于将接收到的DatagramPacket数据包中,在接收到数据之前会一直处于阻塞状态,只有接收数据时,该方法才被执行 |
void send(DatagramPacket p) | 用于发送DatagramPacket数据包,发送的数据包中包含将要发送的数据,数据的长度,远程主机的IP地址和端口号 |
void close() | 关闭当前的Socket,通知驱动程序释放这个Socket保留的资源 |
接收数据的代码
package net;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class Net {
public static void main(String args[])throws Exception{
byte[] buf=new byte[1024];
//定义一个套接字(货运港口)
DatagramSocket ds=new DatagramSocket(8954);
//准备一个集装箱
DatagramPacket dp=new DatagramPacket(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.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class Send {
public static void main(String args[])throws Exception{
//创建一个港口
DatagramSocket ds=new DatagramSocket();
String str="hello world";
//定义一个集装箱
DatagramPacket dp=new DatagramPacket(str.getBytes(),str.length(),
InetAddress.getByName("localhost"),8954);
System.out.println("发送信息");
//发送货物
ds.send(dp);
ds.close();
}
}