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位二進制
端口
區(qū)分一臺主機的多個不同應用程序尿贫,端口號范圍為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();//獲取字節(jié)數組形式的IP地址,以點分隔的四部分//獲取其他主機的InetAddress實例InetAddress address2 =InetAddress.getByName("其他主機名");InetAddress address3 =InetAddress.getByName("IP地址");
URL類
URL(Uniform Resource Locator)統一資源定位符,表示Internet上某一資源的地址穴翩,協議名:資源名稱
//創(chuàng)建一個URL的實例URL baidu =newURL("http://www.baidu.com");URL url =newURL(baidu,"/index.html?username=tom#test");//犬第?表示參數,#表示錨點url.getProtocol();//獲取協議url.getHost();//獲取主機url.getPort();//如果沒有指定端口號芒帕,根據協議不同使用默認端口歉嗓。此時getPort()方法的返回值為 -1url.getPath();//獲取文件路徑url.getFile();//文件名,包括文件路徑+參數url.getRef();//相對路徑背蟆,就是錨點鉴分,即#號后面的內容url.getQuery();//查詢字符串,即參數
使用URL讀取網頁內容
通過URL對象的openStream()方法可以得到指定資源的輸入流带膀,通過流能夠讀取或訪問網頁上的資源
//使用URL讀取網頁內容//創(chuàng)建一個URL實例URL url = new URL("http://www.baidu.com");InputStreamis= url.openStream();//通過openStream方法獲取資源的字節(jié)輸入流InputStreamReader isr = newInputStreamReader(is,"UTF-8");//將字節(jié)輸入流轉換為字符輸入流,如果不指定編碼志珍,中文可能會出現亂碼BufferedReader br = newBufferedReader(isr);//為字符輸入流添加緩沖,提高讀取效率Stringdata= br.readLine();//讀取數據while(data!=null) {? ? System.out.println(data);//輸出數據data= br.readerLine();}br.close();isr.colose();is.close();
我自己是一個從事了6年的Java全棧工程師垛叨,最近整理了一套適合2019年學習的Java\大數據資
料伦糯,從基礎的Java、大數據面向對象到進階的框架知識都有整理哦,可以來我的主頁免費領取哦敛纲。