UDP協議
------- android培訓、java培訓、期待與您交流! ----------
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的不可靠性,數據包在傳輸時會發生跳變,可能發生不可預知的錯誤。
新聞熱點
疑難解答