公眾號關注“菜鳥要飛”
設為 “星標”,和10萬優秀程序員一起成長!
原文:/oubo//2012/01/16/.html
01網絡編程基本概念1.OSI與TCP/IP體系模型
2.IP和端口
解決了文章最開始提到的定位的問題。
IP在互聯網中能唯一標識一臺計算機,是每一臺計算機的唯一標識(身份證);網絡編程是和遠程計算機的通信,所以必須先能定位到遠程計算機;IP幫助解決此問題;一臺計算機中可能有很多進程,具體和哪一個進程進行通信,這就得靠端口來識別;
IP和端口能唯一定位到需要通信的進程。這里的IP表示地址,區別于IP協議。在OSI體系還是TCP/IP體系中,IP協議位于網際層,來封裝IP地址到報文中。
3.TCP和UDP協議
TCP是 的簡稱,是一種面向連接的保證可靠傳輸的協議。通過TCP協議傳輸,得到的是一個順序的無差錯的數據流。發送方和接收方的成對的兩個之間必須建立連接,以便在TCP協議的基礎上進行通信,當一個(通常都是 )等待建立連接時,另一個可以要求進行連接,一旦這兩個連接起來,它們就可以進行雙向數據傳輸,雙方都可以進行發送或接收操作。
UDP是User 的簡稱,是一種無連接的協議,每個數據報都是一個獨立的信息,包括完整的源地址或目的地址,它在網絡上以任何可能的路徑傳往目的地,因此能否到達目的地,到達目的地的時間以及內容的正確性都是不能被保證的。
比較:
UDP:
每個數據報中都給出了完整的地址信息,因此無需要建立發送方和接收方的連接。
UDP傳輸數據時是有大小限制的,每個被傳輸的數據報必須限定在64KB之內。
UDP是一個不可靠的協議,發送方所發送的數據報并不一定以相同的次序到達接收方。
TCP:
面向連接的協議,在之間進行數據傳輸之前必然要建立連接,所以在TCP中需要連接時間。
TCP傳輸數據大小限制,一旦連接建立起來,雙方的就可以按統一的格式傳輸大的數據。
TCP是一個可靠的協議,它確保接收方完全正確地獲取發送方所發送的全部數據。
數據楨:
應用:
TCP在網絡通信上有極強的生命力,例如遠程連接()和文件傳輸(FTP)都需要不定長度的數據被可靠地傳輸。但是可靠的傳輸是要付出代價的,對數據內容正確性的檢驗必然占用計算機的處理時間和網絡的帶寬,因此TCP傳輸的效率不如UDP高。
UDP操作簡單,而且僅需要較少的監護,因此通常用于局域網高可靠性的分散系統中/應用程序。例如視頻會議系統,并不要求音頻視頻數據絕對的正確,只要保證連貫性就可以了,這種情況下顯然使用UDP會更合理一些。
4.
是網絡驅動層提供給應用程序編程接口和一種機制。我們可以把 比喻成是一個港口碼頭。應用程序只要把貨物放到港口碼頭上,就算完成了貨物的運送。對于接收方應用程序也要創建一個港口碼頭,只需要等待貨物到達碼頭后將貨物取走。
是在應用程序中創建的,它是通過一種綁定機制與驅動程序建立關系,告訴自己所對應的 IP 和 Port。在網絡上傳輸的每一個數據幀,必須包含發送者的 IP 地址和端口號。創建完 以后,應用程序寫入到 的數據,由 交給驅動程序向網絡上發送數據,計算機從網絡上收到與某個 綁定的 IP 和 Port 相關的數據后,由驅動程序再交給 ,應用程序就可以從這個 中讀取接收到的數據。網絡應用程序就是這樣通過 發送和接收的。
數據發送過程:
數據接收過程:
5.常用應用層協議
應用層協議是為了解決某一類應用問題,而問題的解決又往往是通過位于不同主機中的多個應用進程之間的通信和協同工作來完成的。應用層的具體內容就是規定應用進程在通信時所遵循的協議。
網絡編程常用類
1.類Java中的是一個代表IP地址的封裝。IP地址可以由字節數組和字符串來分別表示,將IP地址以對象的形式進行封裝,可以更方便的操作和獲取其屬性。沒有構造方法網絡編程實現文件傳輸,可以通過兩個靜態方法獲得它的對象。
//根據主機名來獲取對應的InetAddress實例
? ? InetAddress ip = InetAddress.getByName("www.baidu.com");
? ?//判斷是否可達
? ?System.out.println("baidu是否可達:"?+ ip.isReachable(2000));
? ?//獲取該InetAddress實例的IP字符串
? ?System.out.println(ip.getHostAddress());
? ?//根據原始IP地址(字節數組形式)來獲取對應的InetAddress實例
? ? ? ?InetAddress local = InetAddress.getByAddress(new?byte[]{127,0,0,1});
? ?System.out.println("本機是否可達:"?+ local.isReachable(5000));
? ?//獲取該InetAddress實例對應的全限定域名
? ?System.out.println(local.getCanonicalHostName());
2.URL和類
網絡中的URL( )是統一資源定位符的簡稱。它表示上某一資源的地址。通過URL我們可以訪問上的各種網絡資源,比如最常見的WWW,FTP站點。
URL可以被認為是指向互聯網資源的“指針”,通過URL可以獲得互聯網資源相關信息,包括獲得URL的對象獲取資源的信息,以及一個到URL所引用遠程對象的連接。對象可以向所代表的URL發送請求和讀取URL的資源。通常,創建一個和URL的連接,需要如下幾個步驟:
創建URL對象,并通過調用方法獲得對象;
設置參數和普通請求屬性;
向遠程資源發送請求;
遠程資源變為可用,程序可以訪問遠程資源的頭字段和通過輸入流來讀取遠程資源返回的信息。
這里需要重點討論一下第三步:如果只是發送GET方式請求,使用方法建立和遠程資源的連接即可;如果是需要發送POST方式的請求,則需要獲取對象所對應的輸出流來發送請求。
這里需要注意的是,由于GET方法的參數傳遞方式是將參數顯式追加在地址后面,那么在構造URL對象時的參數就應當是包含了參數的完整URL地址,而在獲得了對象之后,就直接調用方法即可發送請求。而POST方法傳遞參數時僅僅需要頁面URL,而參數通過需要通過輸出流來傳遞。另外還需要設置頭字段。以下是兩種方式的代碼:
//1. 向指定URL發送GET方法的請求
String urlName = url +?"?"?+ param;
URL realUrl =?new?URL(urlName);
//打開和URL之間的連接
URLConnection conn = realUrl.openConnection();
//設置通用的請求屬性
conn.setRequestProperty("accept",?"*/*");
conn.setRequestProperty("connection",?"Keep-Alive");
conn.setRequestProperty("user-agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
//建立實際的連接
conn.connect(); ? ?
//2. 向指定URL發送POST方法的請求
URL realUrl =?new?URL(url);
//打開和URL之間的連接
URLConnection conn = realUrl.openConnection();?
//設置通用的請求屬性
conn.setRequestProperty("accept",?"*/*");
conn.setRequestProperty("connection",?"Keep-Alive");
conn.setRequestProperty("user-agent",?"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");?
//發送POST請求必須設置如下兩行
conn.setDoOutput(true);
conn.setDoInput(true);
//獲取URLConnection對象對應的輸出流
out?=?new?PrintWriter(conn.getOutputStream());
//發送請求參數
out.print(param);
3.和
這兩個類可以別用于將/x-www-form- MIME類型的字符串轉換為普通字符串,將普通字符串轉換為這類特殊型的字符串。使用類的靜態方法()用于解碼,類的靜態方法()用于編碼。具體使用方法如下:
//將application/x-www-form-urlencoded字符串轉換成普通字符串 ?
String keyWord = URLDecoder.decode("%E6%9D%8E%E5%88%9A+j2ee",?"UTF-8"); ?
System.out.println(keyWord); ?
//將普通字符串轉換成 ?application/x-www-form-urlencoded字符串 ?
String urlStr = URLEncoder.encode(?"ROR敏捷開發最佳指南"?,?"GBK"); ?
System.out.println(urlStr);
4.和類
網絡上的兩個程序通過一個雙向的通訊連接實現數據的交換,這個雙向鏈路的一端稱為一個。通常用來實現客戶方和服務方的連接。是TCP/IP協議的一個十分流行的編程界面,一個由一個IP地址和一個端口號唯一確定。但是,所支持的協議種類也不光TCP/IP一種,因此兩者之間是沒有必然聯系的。
在Java環境下,編程主要是指基于TCP/IP協議的網絡編程。端(監聽)某個端口是否有連接請求,端向端發出(連接)請求,端向端發回(接受)消息。一個連接就建立起來了。端和端都可以通過Send,Write等方法與對方通信。
TCP 的通信過程如下圖:
5.類
UDP協議是一種不可靠的網絡協議,它在通訊實例的兩端個建立一個,但這兩個之間并沒有虛擬鏈路,這兩個只是發送和接受數據報的對象。包中提供了兩個類和用來支持數據報通信網絡編程實現文件傳輸,用于在程序之間建立傳送數據報的通信連接, 則用來表示一個數據報。的構造方法:
DatagramSocket();
DatagramSocket(int prot);
DatagramSocket(int port, InetAddress laddr);
其中,port指明所使用的端口號,如果未指明端口號,則把連接到本地主機上一個可用的端口。laddr指明一個可用的本地地址。給出端口號時要保證不發生端口沖突,否則會生成類例外。注意:上述的兩個構造方法都聲明拋棄非運行時例外,程序中必須進行處理,或者捕獲、或者聲明拋棄。用數據報方式編寫/程序時,無論在客戶方還是服務方,首先都要建立一個對象,用來接收或發送數據報,然后使用類對象作為傳輸數據的載體。
03 總結
1.網絡編程的核心是IP、端口、協議三大元素2.網絡編程的本質是進程間通信3.網絡編程的2個主要問題:1是定位主機,2是數據傳輸
◆?◆?◆ ?◆?◆
看完一件事 點個「在看」,讓更多人也能看到這篇內容
推薦閱讀
點個在看,少個bug