IP地址和端口號


IP地址和端口號

要想使網絡中的計算機能夠進行通信,必須為每台計算機指定一個標識號,通過這個標識號來指定接受數據的計算機或者發送數據的計算機。

TCP/IP協議中,這個標識號就是IP地址,它可以唯一標識一台計算機。

 

IP地址和端口號的作用,如下圖所示:

源計算機通過IP地址找到目標計算機,然后通過端口號找到應用程序

InetAddress類

常用方法:

getByName(String host);   用於獲得表示指定主機的InetAddress對象

getLocalHost();   用於獲得表示本地的InetAddress對象,通過InetAddress對象便可獲取指定主機名,IP地址等

getHostName();  

getHostAddress();

public class Demo01 { public static void main(String[] args) throws UnknownHostException {
     //已知主機名 InetAddress inet
=InetAddress.getByName("XB-20161105SFVO"); System.out.println(inet);
     //獲取本地主機名 InetAddress inet2
=InetAddress.getLocalHost(); System.out.println(inet2); //獲取主機名 System.out.println(inet.getHostName()); //獲取主機IP地址 System.out.println(inet.getHostAddress()); } }

UDP協議

UDP是無連接通信協議,即在數據傳輸時,數據的發送端和接收端不建立邏輯連接。簡單來說,當一台計算機向另外一台計算機發送數據時,發送端不會確認接收端是否存在,就會發出數據,同樣接收端在收到數據時,也不會向發送端反饋是否收到數據。

就像新聞聯播的播放,每天都在播放,不管有沒有人在看,每個人看了新聞聯播,但卻不會告訴對方新聞我看了一樣。

 

由於使用UDP協議消耗資源小,通信效率高,所以通常都會用於音頻、視頻和普通數據的傳輸例如視頻會議都使用UDP協議,因為這種情況即使偶爾丟失一兩個數據包,也不會對接收結果產生太大影響。

 

但是在使用UDP協議傳送數據時,由於UDP的面向無連接性,不能保證數據的完整性,容易數據丟失,影響數據傳輸,因此在傳輸重要數據時不建議使用UDP協議。

 

UDP傳輸數據被限制在64K以內。

 

TCP協議

 

TCP協議是面向連接的通信協議,即在傳輸數據前先在發送端和接收端建立邏輯連接,然后再傳輸數據,它提供了兩台計算機之間可靠無差錯的數據傳輸。在TCP連接中必須要明確客戶端與服務器端,由客戶端向服務端發出連接請求,每次連接的創建都需要經過“三次握手”。第一次握手,客戶端向服務器端發出連接請求,等待服務器確認,第二次握手,服務器端向客戶端回送一個響應,通知客戶端收到了連接請求,第三次握手,客戶端再次向服務器端發送確認信息,確認連接。

整個交互過程如下圖所示:

每次握手都是一次確認的過程。

由於TCP協議的面向連接特性,它可以保證傳輸數據的安全性,所以是一個被廣泛采用的協議,例如在下載文件時,如果數據接收不完整,將會導致文件數據丟失而不能被打開,因此,下載文件時必須采用TCP協議

UDP通信

 

UDP是一種面向無連接的協議,因此,在通信時發送端和接收端不用建立連接。

UDP通信的過程就像是貨運公司在兩個碼頭間發送貨物一樣。在碼頭發送和接收貨物時都需要使用集裝箱來裝載貨物,UDP通信也是一樣,發送和接收的數據也需要使用“集裝箱”進行打包,為此JDK中提供了一個DatagramPacket類,該類的實例對象就相當於一個集裝箱,用於封裝UDP通信中發送或者接收的數據。

發送端:指定了封裝數據的字節數組和數據的大小,沒有指定IP地址和端口號

 

接收端:一定要明確指出數據的目的地(ip地址和端口號)而接收端不需要明確知道數據的來源,只需要接收到數據即可。

 

 

使用此構造方法在創建DatagramPacket對象時,不僅指定了封裝數據的字節數組和數據的大小,還指定了數據包的目標IP地址(addr)和端口號(port)。該對象通常用於發送端,因為發送數據時必須指定接收端的IP地址和端口號,就好像發送貨物的集裝箱上面必須標明接收人的地址一樣。

DatagramPacket類中的常用方法進行詳細地講解,如下表所示。

DatagramSocket

DatagramPacket數據包的作用就如同是“集裝箱”,可以將發送端或者接收端的數據封裝起來。然而運輸貨物只有“集裝箱”是不夠的,還需要有碼頭。在程序中需要實現通信只有DatagramPacket數據包也同樣不行,為此JDK中提供的一個DatagramSocket類。DatagramSocket類的作用就類似於碼頭,使用這個類的實例對象就可以發送和接收DatagramPacket數據包。

 

DatagramSocket類中常用的構造方法:

 

該構造方法用於創建發送端的DatagramSocket對象在創建DatagramSocket對象時,並沒有指定端口號,此時,系統會分配一個沒有被其它網絡程序所使用的端口號。

 

該構造方法既可用於創建接收端的DatagramSocket對象又可以創建發送端的DatagramSocket對象,在創建接收端的DatagramSocket對象時,必須要指定一個端口號,這樣就可以監聽指定的端口。

DatagramSocket類中的常用方法。

 

代碼示例:

 
         

 

 
         

/*UDP完成數據的發送

* 發送端

* 1,創建DatagramPacket對象,封裝數據接收的地址和端口

* 2,創建DatagramSocket對象

* 3,調用DatagramSocket中的send方法,發送數據

* 4關閉資源DatagramSocket*/

public class UDPSend { public static void main(String[] args) throws IOException { Scanner sc=new Scanner(System.in); InetAddress inet=InetAddress.getByName("192.168.1.171"); //創建快遞公司對像
        DatagramSocket ds=new DatagramSocket(); //創建數據打包對象,封裝要發送的數據、接收端的ip和端口號
        while(true){ byte[] bytes=sc.next().getBytes(); DatagramPacket dp=new DatagramPacket(bytes, bytes.length,inet,9000); //發送數據
 ds.send(dp); } //釋放資源 //ds.close(); } }

/*UDP完成數據的接收

* UDP接收端

* 1,創建DatagramSocket對象綁定端口號(要和發送端端口號一致)

* 2,創建字節數組,接收發來的數據

* 3,創建數據包對象DatagramPacket

* 4,調用DatagramSocket對象方法receiveDatagramPacket dp)接收數據,數據放在數據包中

* 5,拆包

   發送的IP地址

    數據包對象DatagramPacket方法getAddress()獲取的是發送端的IP地址對象

    返回值是InetAddress對象

  接收到的字節個數

     數據包對象DatagramPacket方法getLength()
 發送方的端口號
      數據包對象DatagramPacket方法getPort()發送端口
* 6,關閉資源*/
public class UDPRecive { public static void main(String[] args) throws IOException { //創建快遞公司對象,明確端口號
        DatagramSocket ds=new DatagramSocket(9000); //創建字節數組,接收數據
        byte[] bytes=new byte[1024]; while(true){ //創建拆包對象
            DatagramPacket dp=new DatagramPacket(bytes, bytes.length); //接收數據
 ds.receive(dp); //拆包 //獲取發送端ip地址
            String ip=dp.getAddress().getHostAddress(); //獲取發送端端口號
            int port=dp.getPort(); //獲取數據長度
            int len=dp.getLength(); System.out.println("ip地址為:"+ip+",端口號為:"+port+"發送的內容為:"+new String(bytes,0,len)); } //釋放資源 //ds.close();
 } }

要實現UDP通信需要創建一個發送端程序和一個接收端程序,很明顯,在通信時只有接收端程序先運行,才能避免因發送端發送的數據無法接收,而造成數據丟失。因此,首先需要來完成接收端程序的編寫。

執行的時候先執行接收端,再執行發送端

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM