Java Socket編程之常識網絡基礎知識

更多物聯網高併發編程知識請移步:https://www.yuque.com/shizhiy...


Java Socket編程之常識網絡基礎知識

網絡基礎知識(參考計算機網絡)
  《TCP/IP協議棧及OSI參考模型詳解》
          

兩臺計算機間進行通訊需要以下三個條件

           IP地址、協議、端口號

TCP/IP協議

目前世界上應用最爲廣泛的協議,是以TCP和IP爲基礎的不同層次上多個協議的集合,也成TCP/IP協議族、或TCP/IP協議棧

  • TCP:Transmission Control Protocol 傳輸控制協議
  • IP:Internet Protocol 互聯網協議

TCP/IP五層模型

  • 應用層:HTTP、FTP、SMTP、Telnet等
  • 傳輸層:TCP/IP
  • 網絡層:
  • 數據鏈路層:
  • 物理層:網線、雙絞線、網卡等

IP地址

爲實現網絡中不同計算機之間的通信,每臺計算機都必須有一個唯一的標識---IP地址。 32位二進制

端口

區分一臺主機的多個不同應用程序,端口號範圍爲0-65535,其中0-1023位爲系統保留。    

如:HTTP:80  FTP:21 Telnet:23

IP地址+端口號組成了所謂的Socket,Socket是網絡上運行的程序之間雙向通信鏈路的終結點,是TCP和UDP的基礎

Socket套接字

網絡上具有唯一標識的IP地址和端口組合在一起才能構成唯一能識別的標識符套接字。
Socket原理機制:

  • 通信的兩端都有Socket
  • 網絡通信其實就是Socket間的通信
  • 數據在兩個Socket間通過IO傳輸      

Java中的網絡支持

針對網絡通信的不同層次,Java提供了不同的API,其提供的網絡功能有四大類:

  • InetAddress:用於標識網絡上的硬件資源,主要是IP地址
  • URL:統一資源定位符,通過URL可以直接讀取或寫入網絡上的數據
  • Sockets:使用TCP協議實現的網絡通信Socket相關的類
  • Datagram:使用UDP協議,將數據保存在用戶數據報中,通過網絡進行通信。

 

InetAddress

InetAddress類用於標識網絡上的硬件資源,標識互聯網協議(IP)地址。 

//獲取本機的InetAddress實例
InetAddress address =InetAddress.getLocalHost();
address.getHostName();//獲取計算機名
address.getHostAddress();//獲取IP地址
byte[] bytes = address.getAddress();//獲取字節數組形式的IP地址,以點分隔的四部分

//獲取其他主機的InetAddress實例
InetAddress address2 =InetAddress.getByName("其他主機名");
InetAddress address3 =InetAddress.getByName("IP地址");

URL類

URL(Uniform Resource Locator)統一資源定位符,表示Internet上某一資源的地址,協議名:資源名稱 

//創建一個URL的實例
URL baidu =new URL("http://www.baidu.com");
URL url =new URL(baidu,"/index.html?username=tom#test");//?表示參數,#表示錨點
url.getProtocol();//獲取協議
url.getHost();//獲取主機
url.getPort();//如果沒有指定端口號,根據協議不同使用默認端口。此時getPort()方法的返回值爲 -1
url.getPath();//獲取文件路徑
url.getFile();//文件名,包括文件路徑+參數
url.getRef();//相對路徑,就是錨點,即#號後面的內容
url.getQuery();//查詢字符串,即參數

使用URL讀取網頁內容

通過URL對象的openStream()方法可以得到指定資源的輸入流,通過流能夠讀取或訪問網頁上的資源

//使用URL讀取網頁內容
//創建一個URL實例
URL url = new URL("http://www.baidu.com");
InputStream is = url.openStream();//通過openStream方法獲取資源的字節輸入流
InputStreamReader isr = newInputStreamReader(is, "UTF-8");//將字節輸入流轉換爲字符輸入流,如果不指定編碼,中文可能會出現亂碼
BufferedReader br = newBufferedReader(isr);//爲字符輸入流添加緩衝,提高讀取效率
String data = br.readLine();//讀取數據
while (data != null) {
    System.out.println(data);//輸出數據
    data = br.readerLine();
}
br.close();
isr.colose();
is.close();

     

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章