Java筆記系列(基於馬士兵的課堂)(7)-web編程

     網絡編程(第十章)!=網站編程

概述:網絡基礎,tcp/ip協議,ip地址,soket通信,TCP/UDP通信。

網絡編程涉及後端,前端,而網站編程,更多的或者僅僅是隻涉及前端的編程。全世界所有網絡全部連載一起。

通信協議:統一互聯網語言,統一傳輸方式。

網絡通信接口:兩個接口之間可以互相通話,通信。

硬件裝置:網卡。軟件:規定雙方進行通信約定的協議,規定怎麼樣說話。

網絡通信協議本身是分層的:分層可以讓我們不用考慮底層物理介質怎樣去走,分層屏蔽了這些信號傳輸的方式,信號轉換的不同內容,二進制轉換物理開關的過程,分層翻譯了這些信號。這樣不僅統一了某一層的編程語言,也讓層與層之間互不干擾,獨立發展,只要層與層之間的接口不變。但是這也添加了底層編程的麻煩,但是上層應用編程起來方便許多。Java的編譯器,已經屏蔽了許多底層內容,我們直接使用即可,而且使用也非常統一(數據庫的製作也大不相同,也經過屏蔽),接口統一方便了上層。(上層只要向下層發號施令)

分層模型:ISO(internationalstandard organization)OSI(七層標準<國際標準化組織>),編程人員事實標準(物理層(數據鏈路層)-IP層-TCP/UDP層-應用層


<四層模型>)


數據在網絡中的傳輸過程:首先要數據封裝,上層傳到下層,硬件輸出,其他硬件接受,數據拆封再向上翻譯,同一層相互之間聯繫緊密,相鄰層次之。

TCP/IP:底層協議複雜《TCP/IP詳解》(網絡底層)解釋清楚。

IP層:提供了獨一無二的IP地址(機器的名字獨一無二)。網際層主要協議。每一個小段最大255(四個字節表示一端<int類型>),IP本身佔4字節(IPV4),內網IP本身是假的IP,只有聯網後出現的IP才能算真正的IP,但是網站需要真正的公共IP佔有一個真正的IP,IPV6(8個字節)。

IP地址裏有一些位數是網絡的IP,一些是主機的IP。網絡IP(佔1個字節叫A類網,2個字節叫B類網…C類網)C類網擁有真實IP的只有最多255個,單可以用內部網,使用一個真實IP對應多個主機。如果網絡分好子網之後又想分子網,必須將網絡IP擴大一點。不同子網互相之間的通訊必須經過一個網官(一塊子網網卡,一塊公網網卡,也可以一個網卡,兩個IP,這種機制一邊連內網,一邊連公網)。

子網掩碼:凡是1的都是網絡IP,凡是0的都是主機IP。(在子網中再分子網時起作用)

在一個網上的主機可以互相訪問(子網掩碼相同)

子網再分子網,子網裏可以再有內網。(網IP擴展後,相當於產生了新的子網IP,再分公網IP)。如果想全世界都可以訪問的一定是公網IP,儘管有一些軟件現在可以將內網發到公網上。

ICMP網絡差縮控制協議。PIN走的是這個協議。防火牆,網絡殺毒軟件,作弊腳本。

TCP、UDP協議:

建立在IP層上。這是兩種通話協議。

TCP:可靠地連接。確定兩者已經連在一起,纔會開始傳輸。底層的三次握手,確定了已連接。這時纔會傳輸。特點:首先建立連接,再確認連接(可靠地,在進行傳輸),而且後面的包不會提前到達。

UDP:簡單的連接,原始發送。發送時無需建立連接,是一種不可靠的連接。

但是由於TCP效率太低,UDP的效率高很多所以UDP還是有用的,網絡轉賬一般TCP,往上通話的,視頻的用UDP,因爲TCP會確認是否到達,若有延遲會一直傳,容易堵(下一個不能提前),而UDP不會,最多是丟包,只要大多數可靠就行了。網絡遊戲進行時是UDP,登陸上可能是TCP。網絡卡頓其實就是一種丟包。

路由器(選擇怎麼將包發出去)是可能丟包的,網絡負荷大時,會將包丟掉,也有可能是物理原因丟包。還有可能是由於網絡阻塞包穿過太多的節點(包一旦穿過一定的節點就會自動丟失)。

Socket<插座>編程(網絡編程):


對於java,windows…網絡編程都叫網絡編程。伯克利大學的socket開發包應用廣泛,windows,linux,java,c都可以應用。鏈路中的一段叫做socket。

Java所有關於網絡編程的都在java.net包裏(socket類和severSocket)兩個插座,severSocket實現TCP服務端連接(實現server端),socket類實現client端。

建立連接時所需信息爲遠程計算機IP地址和,端口號(區分不同的應用程序應該收到的網絡信息),2個字節,65536個網絡應用程序的區分。(80端口,http//協議,21是mstp協議<郵件發送協議>)

自己編寫程序時1024以上的端口號,1024以下系統隨時徵用,有一些固定的端口號佔用。端口號本身分爲TCP端口,UDP端口,兩個端口並非一回事,兩者是分開的每一個都是65536個端口。

寫Socket時應該serverclient同時寫,一個協議一個協議的來。ServerSocket在哪傻等着。其構造方法,要告訴他在哪個端口上監聽客戶端連接(傻等着)等待客戶連接端口<應用程序監聽>。Client端的socket要相應的new socket告訴他本機IP和連接相應的端口。Client端申請向sever端連接,socket(與client端的連接,seversocket中的),他有一個方法:accept()返回值是socket,這個方法是用來接受申請連接(client端的),由於某個端口只有一個,所以new一個新插座與client端的插座相連接,也就是說某種程度上,sever端是在不斷地new插座,再不斷地accept,accept方法是阻塞式的,運行到一半停止(所以可以使用死循環式的運行:while(true)),也就是等着,一直在監聽。一般先運行server端。

當兩個端連接以後,連接已經搭成,但是還是不能相互交流,要想進行端與端之間的交流還是要通過管道,也就是流來實現。(OutputStream中的getOutputStream方法,DataOutputStream中的writeUTF()方法寫UTF8也就是網絡上常用的Unicode<勿忘關閉管道>),相應的client端應該引入io流裏new一個相應的,對於socket對象可以使用方法getIntputStream(new一個新的管道,說明socket這個類裏面有這樣的一個方法),這個s還連接着端口,socket也可以關閉(close)。

當某個端口被佔用,另外一個sever是不能再佔用這個端口的。同樣readUTF()也是一個阻塞式的,如果對方不寫任何東西,他會在這裏傻傻的等待。當他接收不到信息,他會一直等待。但是這是效率不高的,當sever readUTF在等待時,另外一個客戶端是無法連接sever的。<這是同步式的java編程,而java早已推出異步式的編程(異步io),這是比較有效率的>,更強的vc裏有一個io comlitionport異步且有線程池等待連接。大量的連接已經可以連接在java編寫的程序上了。

getInetAdress()<iP地址的超集>得到對方的IP地址,getPort()得到對方的端口號(在服務器端寫拿到的就是client端輸送信號的端口號),一旦客戶端關閉後,之前端口就不再佔用。注意讀寫順序,先寫先讀對應後寫後讀否則構成死鎖。

注意:對於產生的exception之後請不要忘記finally語句關閉管道,對於這種監聽的問題,catch exception之後也可以用System.exit使系統退出。勿忘還有一根管道:System.in。

對於如果兩個socket使用循環,實際上是很簡陋的,二者只能一人一句,與實際上的聊天室是很有區別的。

對於本章內容與io章聯繫極其緊密,應同時回顧兩章。

UDP

不可靠的,將程序打包發出,對於UDP本身不區分seversocket與socket;UDP的socket是無線連接的。它的socket是datagramsocket(類型),對去對方傳來的數據要用datagrampacket(類)它的構造方法,要給一個字節數組,還要告訴可以佔多大的內存。對於UDP的socket端口要區別與TCP的端口,二則不能混爲一談。

接收數據:用socket.receive(packet);這也是一個阻塞式方法,packet.getlength()可以知道到底這個包裹收了多少BYTe的數據。(相應String構造方法裏有一個講一個字節數組的一部分轉化爲字符串的構造方法,對應着將這個包裹打開的過程)。

客戶端傳輸數據:將某個字符串相應的轉化爲字節數組。(getByte)。也是要用datagrampacket<dp是不需要關閉的,但sp是需要關閉的>,inetsocketsocketAdress(ip)繼承Socketadress(ip+端口+…)。雖然UDP只仍包,但路由器需要知道路徑,此時datagramsocket在客戶端new的端口是發出數據的端口,再用send(包裹);方法扔包。

怎樣將一個字節數組中的long類型的數讀出來,先插一個ByteArrayInputStream和DataInputStream可以讀出long類型數所以再套在它上面,用readlong方法讀出來。

注意這裏BAIS沒有插在文件或者鍵入上,而是插在了字節數組上。

總結:

掌握網絡爲什麼要分層(是爲了簡化,分工明確,體現可擴展性)

IP的概念(端口,和各種類型IP地址),TCP與UDP的區別,實際程序的TCP與UDP的不同(固定化,勿忘關閉),注意知識點的融會貫通,流的使用,線程的融合。

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