UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。它是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去!
UDP适用于一次只传送少量数据、对可靠性要求不高的应用环境。正因为UDP协议没有连接的过程,所以它的通信效率高;但也正因为如此,它的可靠性不如TCP协议高。QQ就使用UDP发消息,因此有时会出现收不到消息的情况。
一、UDP协议发送数据
发送处理过程:
-
创建发送端Socket对象——DatagramSocket
-
创建数据并将数据打包到DatagramPacket对象
-
通过Socket发送
-
释放相关资源
发送处理代码:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
public class TestUDPSend {
public static void main(String[] args) { String data="hello UDP"; DatagramSocket datagramSocket=null; try { //实例化套接字,并指定发送端口 datagramSocket=new DatagramSocket(8080); //指定数据目的地的地址,以及目标端口 InetAddress destination=InetAddress.getByName("localhost"); DatagramPacket datagramPacket= new DatagramPacket(data.getBytes(), data.getBytes().length,destination,8081); //发送数据 datagramSocket.send(datagramPacket); } catch (SocketException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally{ datagramSocket.close(); } } } |
二、UDP协议接收数据
接受处理过程:
-
创建接受端Socket对象——DatagramSocket
-
创建包DatagramPacket对象(数据接收容器)
-
调用接受方法接受数据
-
解析数据包对象,取出接受到的信息
-
释放资源
接受处理代码:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
public class TestUDPReceive {
public static void main(String[] args) { DatagramSocket datagramSocket=null; try { //监视8081端口的内容 datagramSocket=new DatagramSocket(8081); byte[] buf=new byte[1024]; //定义接收数据的数据包 DatagramPacket datagramPacket=new DatagramPacket(buf, 0, buf.length); datagramSocket.receive(datagramPacket); //从接收数据包取出数据 String data=new String(datagramPacket.getData() , 0 ,datagramPacket.getLength()); System.out.println(data); } catch (SocketException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { datagramSocket.close(); } } } |
运行:
先运行接收端,让程序监听8081端口,然后运行发送端发送数据到本机(localhost)的8081端口。
之后会发现在接收端的控制台打印出 ‘hello UDP ’的内容。