使用UDP協議實現文字互動
網路通訊協議有很多種,目前應用最廣泛的是TCP/IP協議(Transmission Control Protocal/Internet Protoal傳輸控制協議/英特網互聯協議),它是一個包括TCP協議和IP協議,UDP(User Datagram Protocol)協議和其它一些協議的協議組。
UDP是無連線通訊協議,即在資料傳輸時,資料的傳送端和接收端不建立邏輯連線。在使用UDP協議傳送資料時,由於UDP的面向無連線性,不能保證資料的完整性,因此在傳輸重要資料時不建議使用UDP協議。
TCP協議是面向連線的通訊協議,即在傳輸資料前先在傳送端和接收端建立邏輯連線,然後再傳輸資料,它提供了兩臺計算機之間可靠無差錯的資料傳輸。在TCP連線中必須要明確客戶端與伺服器端,由客戶端向服務端發出連線請求,每次連線的建立都需要經過“三次握手”。第一次握手,客戶端向伺服器端發出連線請求,等待伺服器確認,第二次握手,伺服器端向客戶端回送一個響應,通知客戶端收到了連線請求,第三次握手,客戶端再次向伺服器端傳送確認資訊,確認連線。由於TCP協議的面向連線特性,它可以保證傳輸資料的安全性,所以是一個被廣泛採用的協議,例如在下載檔案時,如果資料接收不完整,將會導致檔案資料丟失而不能被開啟,因此,下載檔案時必須採用TCP協議。
前面介紹了UDP是一種面向無連線的協議,因此,在通訊時傳送端和接收端不用建立連線。
UDP通訊需要用到兩個類——DatagramPacket類和DatagramSocket類。
DatagramPacket類用於封裝UDP通訊中傳送或者接收的資料。
DatagramPacket類會用到下面兩個方法
DatagramPacket類——使用這個類的例項物件就可以傳送和接收DatagramPacket資料包。
這個類用到下面的方法。
UDP協議就介紹到這,下面演示文字互動程式碼(由於只有一臺電腦所以用的是本機地址)
傳送端
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(); } }
因為無論傳送還是接收都不可能只進行一次,所以會有死迴圈。
&n