UDP---用户数据报协议,是一个简单的面向数据报的运输层协议。(无连接、封包、大小限制、速度快)。
一、UDP协议的特点:
- 将数据及源和目的地封装成数据包中,不需要建立连接。
- 每个数据报的大小限制在64K内
- 因无连接,是不可靠协议。
- 不需要建立连接,速度快。
二、通俗解释:
面向无连接的,你在与不在我都在发。就像邮局寄包裹,比如寄饼干。
,邮局会给你一个盒子和胶带,你将饼干封上(封包),将数据达成数据包,打完之后,贴张地址(天堂街)、门牌号(地狱门18号)(地址、端口),但地址可能不存在,那么则丢弃。
三、UDP举例:
步话机、FEIQ、网络会议、录屏传播、聊天。
四、socket(套接字):
Socket就是为网络服务提供的一种机制。
通信的两端都有Socket。(插座,初期可简单理解为应用程序,而非网卡接口)
网络通信其实就是Socket通信。
数据在两个Socket间通过IO传输。
五、发送端:
需求:通过Udp传输的方式,将一段文字数据发送出去。
定义了一个udp的接收端。
思路:
1、建立udpSocket服务(找邮局)
2、提供数据,将数据封装到数据包中(封包、写地址)
3、通过socket服务发送功能,将数据包发送出去。(包裹上路)
4、关闭资源。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 class UdpSend 2 { 3 public static void main(String[] args) throws Exception 4 { 5 //1、创建udpSocket服务。通过DatagramSocket对象 6 DatagramSocket ds=new DatagramSocket(8888); 7 8 //2、确定数据,并封装数据包 9 byte[] buf="udp I coming".getBytes(); 10 11 /* 12 InetAddress addr=InetAddress.getLocalHost(); 13 InetAddress addr = InetAddress.getByName(null); 14 InetAddress.getByName("localhost"); 15 InetAddress.getByName("127.0.0.1"); 16 */ 17 DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.102"),10000); 18 19 //3、通过socket服务,将已有的数据包发送出去,通过send方法 20 ds.send(dp); 21 22 //4、关闭资源 23 ds.close(); 24 } 25 }
六、接收端:
需求:定义一个应用程序,用于接收udp协议传输的数据并处理
定义udp的接收端。
思路:
1、定义udpSocket服务。通常会监听一个端口。 其实就是给这个接收网络应用程序定义一个数字标识,
方便于明确哪些数据过来,该应用程序可以处理。
2、定义一个数据包。因为要存储接收到的字节数据。
数据包对象中有更多功能可以提取字节数据中的不同数据信息。
3、通过socket服务端额receive方法将收到的数据存入已定义的数据包中
4、通过手机开那片对象的特有功能,将这些不同数据取出打印在控制台上。
5、关闭资源
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 class UdpReceive 2 { 3 public static void main(String[] agrs) throws Exception 4 { 5 //1、创建udpsocket,建立端点 6 DatagramSocket ds=new DatagramSocket(10000); 7 8 //2、定义数据包,用于存储数据 9 byte[] buf=new byte[1024]; 10 DatagramPacket dp=new DatagramPacket(buf,buf.length); 11 12 //3、通过receive方法将收到的数据存到数据包 中 13 ds.receive(dp);//阻塞式方法,线程机制,wait了 14 15 //通过数据包的方法获取其中的数据 16 String ip=dp.getAddress().getHostAddress();//获取发送端IP地址 17 String data=new String(dp.getData(),0,dp.getLength());//获取数据 18 int port=dp.getPort();//获取发送端端口 19 20 System.out.println(ip+"::"+data+"::"+port);//信息打印控制台 21 22 //5、关闭资源 23 ds.close(); 24 } 25 }
运行截图:
七、在接收者与发送者之间的改进
承接UdpDemo.java,实现只能一个人发,一个人收。
1、实现键盘录入:
2、实现连续输入(while)
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 import java.net.*; 2 import java.io.*; 3 4 class UdpSend2 5 { 6 public static void main(String[] args) throws Exception 7 { 8 DatagramSocket ds=new DatagramSocket(); 9 10 //实现键盘录入 11 BufferedReader bufr= 12 new BufferedReader(new InputStreamReader(System.in)); 13 String line=null; 14 15 while ((line=bufr.readLine())!=null) 16 { 17 if ("886".equals(line)) 18 break; 19 byte[] buf=line.getBytes(); 20 21 //IP地址,暂且用本机IP地址,也可用广播地址192.168.1.255 22 DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.102"),10001); 23 24 ds.send(dp); 25 } 26 ds.close(); 27 } 28 } 29 30 31 class UdpReceive2 32 { 33 public static void main(String[] agrs) throws Exception 34 { 35 DatagramSocket ds=new DatagramSocket(10001); 36 37 byte[] buf=new byte[1024]; 38 DatagramPacket dp=new DatagramPacket(buf,buf.length); 39 40 while (true) 41 { 42 ds.receive(dp);//阻塞式方法,线程机制,wait了 43 44 String ip=dp.getAddress().getHostAddress();//获取发送端IP地址 45 String data=new String(dp.getData(),0,dp.getLength());//获取数据 46 int port=dp.getPort();//获取发送端端口 47 48 System.out.println(ip+"::"+data+"::"+port);//信息打印控制台 49 } 50 51 //ds.close();服务器一般不关,也有种方法,while判断条件关 52 } 53 }
运行截图: