當網絡中的兩臺計算機進行通信時,除了確定計算機在網絡中的IP位址外,還需要確定計算機中的一個埠,埠並不是實際的物理設備,它是一個應用程式,這個應用程式來負責兩臺計算機的通信。
一個IP位址標識了一臺主機(伺服器),主機可以提供多種服務,如web服務、ftp服務、遠程桌面等。主機的每個服務都會等待客戶端的連接,客戶端如何區別這些服務呢?這就需要埠來區分了。
埠被規定為一個在0~65535之間的整數,這個整數和提供服務的應用程式關聯。如web服務一般是80埠,ftp服務一般是21埠、遠程桌面一般是3389埠。
當我們通過客戶端瀏覽器訪問一個網站時,在瀏覽器地址欄中輸入該網站的網址,並不需要輸入80埠號。這是因為web服務默認就是80埠號,當客戶端以http協議訪問主機時,主機會默認這是訪問web服務。
在同一臺計算機上埠號不能重複,否則,就會產生埠號衝突。程式設計師或計算機管理員在分配埠號時,需要遵循下面的規則:
(1)1~1023之間的埠號,是由ICANN來管理的,不能分配給用戶自己的應用程式;
(3)1024~5000一般被TCP/IP程序作為臨時埠號使用;
(4)分配的埠號不能發生衝突;
(4)應分配數值大於5000的埠號給用戶開發的應用程式。
TCP用主機的IP位址加上主機上的埠號作為TCP連接的端點,這種端點就叫做套接字(socket)或插口。套接字用(IP位址:埠號)表示,區分不同應用程式進程間的網絡通信和連接,套接字主要有3個參數:通信的目的IP位址、使用的傳輸層協議(TCP或UDP)和使用的埠號。
TCP使用套接字傳輸數據
在Java語言中,使用Socket類來創建套接字,使用Socket類在兩臺計算機之間進行通信時,是有主次之分的,一個稱為伺服器程序,一個稱為客戶端程序。在伺服器端使用ServerSocket類創建套接字,主要是監聽指定的埠,等待客戶端的連接;在客戶端使用Socket類創建套接字,用於連接伺服器端的套接字。伺服器端和客戶端的套接字的IP位址和埠號要一致。
客戶端和服務端通信過程
在伺服器端創建ServerSocket對象,並綁定監聽埠。調用ServerSocket對象的accept()方法監聽客戶端的請求。與客戶端建立連接後,它會返回一個已連接的Socket對象,並通過輸入流讀取客戶端發送的請求信息,然後通過輸出流向客戶端發送響應信息,最後關閉socket及相關資源。
在客戶端創建Socket對象,需要指定連接伺服器的地址和埠號,和伺服器建立連接後,通過輸出流向服務端發送請求信息,然後通過輸入流獲取伺服器的響應信息,最後關閉socket及相關資源。