1.描述:udp协议与tcp协议不同它是面向无连接的(只要能ping通,知道对方的ip我就可往它未被占用的端口发送数据,它只要监听这个端口就能收到)。QQ的部分功能也是基于udp协议。它也有缺点,受到网络原因可能会丢包,丢失数据。
2.这是一个封装好的工具类用来收发
public class UDPUtils {
/**
* 向目标ip下的端口发送数据
* @param ip 目标Ip
* @param port 目标端口
* @param data 要发生的内容
*/
public static void send(String ip,int port,String data){
try {
//实列化套接字
DatagramSocket datagramSocket=new DatagramSocket();
//指定数据要发送的目的ip,和所在ip的端口(接受时监听这个端口)
InetAddress destination=InetAddress.getByName(ip);
DatagramPacket datagramPacket=new DatagramPacket(data.getBytes(),data.getBytes().length,destination,port);
datagramSocket.send(datagramPacket);
} catch (SocketException e) {
e.printStackTrace();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 被动接受发送的数据
* @param port 监听收数据的端口
* @return
*/
public static String receive(int port){
String data=null;
try {
//在本机上监视这个port端口
DatagramSocket datagramSocket=new DatagramSocket(port);
//定义接受数据的包
byte[] buf=new byte[1024];
DatagramPacket datagramPacket=new DatagramPacket(buf,0,buf.length);
//接受到次包
datagramSocket.receive(datagramPacket);
//从这个包中取出数据
data=new String(datagramPacket.getData(),0,datagramPacket.getLength());
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return data;
}
}
3.测试
3.1先启动接受数据
3.2在启动发送数据
接受数成功
结尾:可能的错误:端口号占用,ip ping不通
使用场景:我们可以把他放到线程的死循环中去监听端口,或发送数据。