Socket是一種基於TCP的套接字,這種方法的使用每一個鏈接須要花費必定的時間,要減小這種開銷,因而有了第二種套接字:自尋址套接字,它是使用UDP發送尋址信息,不一樣的是他能夠發送多IP信息包。java
TCP是保證信息到他信息目的,而UDP不會保證,在每個自尋址包中包含了錯誤檢測信息,自尋址包到達目的地以後會對它進行簡單的檢查,若是發現發送錯誤,也不會請求從新發送,直接將其拋棄,因此它是沒有保證的。數組
與Socket類似,客戶端服務端兩邊都是有發送數據和接收數據的通訊。.net
一樣須要先啓動服務端再啓動客戶端指針
1.客戶端封裝代碼code
package lvbowen1; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class Client { public static void main(String args[]) { String host = "localhost"; if (args.length == 1) host = args[0]; DatagramPacket dgp1; DatagramSocket s = null; try { s = new DatagramSocket(); byte[] buffer;// 用來存儲發送的數據 buffer = new String("hello").getBytes();// 字符串轉化數組 // 將主機名轉變爲InetAddress類對象,此對象存儲有ip對象和地址 InetAddress ia = InetAddress.getByName(host); // 建立一個DatagramPacket對象來封裝字節數組的指針以及目標地址信息,目標地址包含了ip和端口號 DatagramPacket dgp = new DatagramPacket(buffer, buffer.length, ia, 10001); s.send(dgp); byte[] buffer2 = new byte[50]; // 建立一個對象來封裝返回來的數據 dgp1 = new DatagramPacket(buffer2, buffer.length, ia, 10001); s.receive(dgp1); System.out.println("server:" + new String(dgp1.getData())); } catch (IOException e) { System.out.println(e.toString()); } finally { if (s != null) s.close(); } } }
2.服務端封裝代碼server
package lvbowen1; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; public class Server { public static void main(String args[]) throws IOException { System.out.println("Server starting...\n"); // 在端口號10000上建立套接字,從用戶程序發送包到這個端口 DatagramSocket s = new DatagramSocket(10001); byte[] data = new byte[50]; DatagramPacket dgp = new DatagramPacket(data, data.length); while (true) { s.receive(dgp); System.out.println("client:" + new String(data)); s.send(dgp); } } }