UDP协议
UDP(User Datagram Protocol)也就是用户数据报协议,是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范。
提到无连接数据传输,那我们首先想到的就是不可靠,数据丢失等等,那么在我们的日常软件中,UDP协议到底都应用在什么场景上呢?举一个大家比较熟悉的例子,就是我们平时所用的聊天软件,因为我们的聊天软件所传输的数据并非是重要数据。
通过ip和端口号,我们可以实现一个小的聊天软件,有兴趣的朋友可以在局域网内通过该软件聊天,安全无插件。好了 废话不多说,我们直接上代码:
//发送端 public class UdpSend { public static void main(String[] args) throws IOException { // TODO Auto-generated method stub Scanner input = new Scanner(System.in); DatagramSocket ds = new DatagramSocket(); System.out.println("请输入聊天语句:"); String name = input.next(); byte[] b = name.getBytes(); DatagramPacket dp = new DatagramPacket(b, b.length, InetAddress .getByName("192.168.15.80"), 10000); ds.send(dp); ds.close(); } }
//接收端 public class UdpReceive { public static void main(String[] args) throws IOException { // TODO Auto-generated method stub DatagramSocket ds = new DatagramSocket(10000); byte[] b = new byte[1024]; DatagramPacket dp = new DatagramPacket(b, b.length); ds.receive(dp); String data = new String(dp.getData(), 0, dp.getLength()); System.out.println(data); } }
我用的是MyEclipse写的代码,有兴趣的童鞋直接粘过去就能用,但是使用时大家会发现一个很明显的缺点,就是只能发送或接受一次程序就运行结束了,这样要怎么解决呢?我的解决方案是在外侧套上一个while(true)的循环,通过条件判断何时退出程序,听起来很简单,可是在加循环的时候要注意一点,就是位置问题,要特别注意的是不能将所有代码一股脑的放到循环中,因为DatagramSocket对象如果放到循环中,那么下次循环执行时就不再是同一对象。正确修改代码如下:
//发送端 public class UdpSend { public static void main(String[] args) throws IOException { // TODO Auto-generated method stub Scanner input = new Scanner(System.in); DatagramSocket ds = new DatagramSocket(); while (true) { System.out.println("请输入聊天语句:"); String name = input.next(); byte[] b = name.getBytes(); DatagramPacket dp = new DatagramPacket(b, b.length, InetAddress .getByName("192.168.0.3"), 10000); ds.send(dp); if (name.equals("结束")) { break; } } ds.close(); } }
//接收端 public class UdpReceive { public static void main(String[] args) throws IOException { // TODO Auto-generated method stub DatagramSocket ds = new DatagramSocket(10000); while (true) { byte[] b = new byte[1024]; DatagramPacket dp = new DatagramPacket(b, b.length); ds.receive(dp); String data = new String(dp.getData(), 0, dp.getLength()); System.out.println(data); } } }
这样一个可以一直在局域网内聊天的小程序就完成了。因为UDP的不可靠性,数据包在传输时会发生跳变,可能发生不可预知的错误。
时间: 2024-11-08 04:50:24