網絡通訊協議有不少種,目前應用最普遍的是TCP/IP協議(Transmission Control Protocal/Internet Protoal傳輸控制協議/英特網互聯協議),它是一個包括TCP協議和IP協議,UDP(User Datagram Protocol)協議和其它一些協議的協議組。java
UDP是無鏈接通訊協議,即在數據傳輸時,數據的發送端和接收端不創建邏輯鏈接。在使用UDP協議傳送數據時,因爲UDP的面向無鏈接性,不能保證數據的完整性,所以在傳輸重要數據時不建議使用UDP協議。數組
TCP協議是面向鏈接的通訊協議,即在傳輸數據前先在發送端和接收端創建邏輯鏈接,而後再傳輸數據,它提供了兩臺計算機之間可靠無差錯的數據傳輸。在TCP鏈接中必需要明確客戶端與服務器端,由客戶端向服務端發出鏈接請求,每次鏈接的建立都須要通過「三次握手」。第一次握手,客戶端向服務器端發出鏈接請求,等待服務器確認,第二次握手,服務器端向客戶端回送一個響應,通知客戶端收到了鏈接請求,第三次握手,客戶端再次向服務器端發送確認信息,確認鏈接。因爲TCP協議的面向鏈接特性,它能夠保證傳輸數據的安全性,因此是一個被普遍採用的協議,例如在下載文件時,若是數據接收不完整,將會致使文件數據丟失而不能被打開,所以,下載文件時必須採用TCP協議。安全
前面介紹了UDP是一種面向無鏈接的協議,所以,在通訊時發送端和接收端不用創建鏈接。服務器
UDP通訊須要用到兩個類——DatagramPacket類和DatagramSocket類。網絡
DatagramPacket類用於封裝UDP通訊中發送或者接收的數據。spa
DatagramPacket類會用到下面兩個方法.net
DatagramPacket類——使用這個類的實例對象就能夠發送和接收DatagramPacket數據包。對象
這個類用到下面的方法。blog
UDP協議就介紹到這,下面演示文字交互代碼(因爲只有一臺電腦因此用的是本機地址)ip
發送端
package com.lty.wangluojianpanluru; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.util.Scanner; /* *實現UDP協議的發送端 * 實現封裝數據的類java.net.DatagramPacket 將數據包裝 * 實現數據傳輸的類java.net.DataGramPacket 將數據包發出去 * * 實現步驟: * 1.建立DatagramPacket對象,封裝數據,接收的地址和端口 * 2.建立DatagramSocket * 3.調用DatagramSocket類方法send,發送數據包 * 4.關閉資源 * * DatagramPacket構造方法 * DatagramPacket(byte[] buf, int length, InetAddress address, int port) * * DatagramSocket構造方法: * DatagramSocket()空參數 * 方法: send(DatagramPacket d) * 文字交互案例思想 * 實現UDP發送,鍵盤輸入的形式 * 輸入完畢發給接收端 */ public class UDPsend { public static void main(String[] args) throws IOException{ Scanner sc=new Scanner(System.in); //建立DatagramSocket對象,數據包的發送和接收對象 DatagramSocket ds =new DatagramSocket(); //建立InetAddress對象,封裝本身的IP地址 InetAddress inet=InetAddress.getByName("127.0.0.1"); while(true) { String message=sc.nextLine(); //建立數據包對象,封裝要發送的數據,接收端IP,端口 byte[] date=message.getBytes(); DatagramPacket dp=new DatagramPacket(date,date.length,inet,5000); //調用ds對象的方法send,發送數據包 ds.send(dp); } // ds.close(); } }
接收端
package com.lty.wangluojianpanluru; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; /* * 實現UDP協議的接收端 * 實現封裝數據的類java.net.DatagramPacket 將數據包接收 * 實現數據輸出的類java.net.DataGramPacket 接收數據包 * * 實現步驟: * 1.建立DatagramSocket對象,綁定端口號 * 要和發送端端口號一致 * 2.建立字節數組,接收發來的數據 * 3.建立數據包對象DatagramPacket * 4.調用DatagramSocket對象方法 * received(DatagramPacket dp)接收數據,數據放在數據包中 * 5.拆包 * 發送的IP地址 * 數據包對象DatagramPacket方法getAddress()獲取的是發送端的IP地址對象 * 返回值是InetAddress對象 * 接收到的字節個數 * 數據包對象DatagramPacket方法getLength() * 發送方的端口號 * 6.關閉資源 * *文字交互案例思想 * 實現UDP協議的接收端 * 永不停歇的接收端 * */ public class UDPReceive { public static void main(String[] args) throws IOException{ // 建立數據包傳輸對象DatagramSocket 綁定端口號 DatagramSocket ds=new DatagramSocket(5000); //建立字節數組 byte[] data = new byte[1024]; //建立數據包對象,傳遞字節數組 while(true) { DatagramPacket dp=new DatagramPacket(data,data.length); //調用ds對象的方法receive傳遞數據包 ds.receive(dp); //獲取發送端的IP地址對象 String ip=dp.getAddress().getHostAddress(); //獲取接收到的字節個數 int length = dp.getLength(); System.out.println(new String(data,0,length)+"....."+ip); } // ds.close(); } }
由於不管發送仍是接收都不可能只進行一次,因此會有死循環。