當你的才華不足以知足你的野心時,應該靜下心來努力學習
雖然UDP是一個不可靠的協議,但它是分發信息的一個理想協議。例如,在屏幕上報告股票市場、顯示航空信息等等。UDP也用在路由信息協議RIP(Routing Information Protocol)中修改路由表。在這些應用場合下,若是有一個消息丟失,在幾秒以後另外一個新的消息就會替換它。UDP普遍用在多媒體應用中。java
在選擇UDP做爲傳輸協議時必需要謹慎。在網絡質量使人十分不滿意的環境下,UDP協議數據包丟失會比較嚴重。可是因爲UDP的特性:它不屬於鏈接型協議,於是具備資源消耗小,處理速度快的優勢,因此一般音頻、視頻和普通數據在傳送時使用UDP較多,由於它們即便偶爾丟失一兩個數據包,也不會對接收結果產生太大影響。好比咱們聊天用的ICQ和QQ就是使用的UDP協議。程序員
在現場測控領域,面向的是分佈化的控制器、監測器等,其應用場合環境比較惡劣,這樣就對待傳輸數據提出了不一樣的要求,如實時、抗干擾性、安全性等。基於此,現場通訊中,若某一應用要將一組數據傳送給網絡中的另外一個節點,可由UDP進程將數據加上報頭後傳送給IP進程,UDP協議省去了創建鏈接和拆除鏈接的過程,取消了重發檢驗機制,可以達到較高的通訊速率。算法
簡單的一個客戶端/服務端數據收發的例子
UDP客戶端:編程
public class UdpClient { public static void main(String[] args) throws IOException { //創建一個socket DatagramSocket socket = new DatagramSocket(); //建立一個數據包 String msg = "你好啊,服務器~"; InetAddress localhost = InetAddress.getByName("localhost"); int port = 9090; DatagramPacket packet = new DatagramPacket(msg.getBytes(), 0, msg.getBytes().length, localhost, port); //發送數據包 socket.send(packet); //關閉流 socket.close(); } }
UDP服務端:安全
public class UdpServer { public static void main(String[] args) throws IOException { //開啓端口 DatagramSocket socket = new DatagramSocket(9090); //接收數據包 byte[] bytes = new byte[1024]; DatagramPacket packet = new DatagramPacket(bytes, 0, bytes.length); //阻塞接收 socket.receive(packet); String msg = new String(packet.getData(),0,packet.getLength()); System.out.println("接收到客戶端發來的數據:" + msg); //關閉數據流 socket.close(); } }
模擬一個學生和老師的聊天對話
//客戶端 public class TalkSend implements Runnable { DatagramSocket socket = null; BufferedReader br = null; private int formPort; private String toIp; private int toPort; public TalkSend(int formPort, String toIp, int toPort) { this.formPort = formPort; this.toIp = toIp; this.toPort = toPort; try { socket = new DatagramSocket(this.formPort); //準備數據 控制檯讀取System.in br = new BufferedReader(new InputStreamReader(System.in)); } catch (SocketException e) { e.printStackTrace(); } } @Override public void run() { while (true) { try { String msg = br.readLine(); byte[] bytes = msg.getBytes(); DatagramPacket packet = new DatagramPacket(bytes, 0, bytes.length, new InetSocketAddress(this.toIp, this.toPort)); //發送數據 socket.send(packet); if (msg.equals("bye")) { break; } } catch (IOException e) { e.printStackTrace(); } } socket.close(); } }
//服務端 public class TalkReceive implements Runnable { DatagramSocket socket = null; private int port; private String msgForm; public TalkReceive(int port, String msgForm) { this.port = port; this.msgForm = msgForm; try { socket = new DatagramSocket(port); } catch (SocketException e) { e.printStackTrace(); } } @Override public void run() { while (true) { try { //準備接收包裹 byte[] bytes = new byte[1024]; DatagramPacket packet = new DatagramPacket(bytes, 0, bytes.length); socket.receive(packet); //斷開鏈接 bye String msg = new String(packet.getData(), 0, packet.getLength()); System.out.println(msgForm + ":" + msg); if ("bye".equals(msg)) { break; } } catch (IOException e) { e.printStackTrace(); } } socket.close(); } }
public class TalkStudent { public static void main(String[] args) { new Thread(new TalkSend(7777,"localhost",8888)).start(); new Thread(new TalkReceive(9999,"老師")).start(); } }
public class TalkTeacher { public static void main(String[] args) { new Thread(new TalkSend(5555,"localhost",9999)).start(); new Thread(new TalkReceive(8888,"學生")).start(); } }
測試一下,結果以下:服務器