在網路編程中只有掌握網路編程的本質才能更好的掌握網路。
首先是網路的定義,網路說到底就是跨越電腦的資訊互動,明白這一點很重要,明白這一點就明白了網路的本質。同時應明白,在傳輸上並沒有多少知識點,關鍵在於協議等決定資料格式的東西上,也就是說協議才是網路編程的重中之重。因此必須掌握協議。(網路通訊協定又稱為協議,包含三要素,文法,語義,時序。協議分為Ethernet,netbeui,ipx/spx,tcp/ip,tcp/ip協議因為擴充性好,穩定安全所以是現在的主流)
在電腦中,存在各種協議,而這種協議實訓在層間關係的,完整的抽象模型是osi模式的七層模式,層間關係是由下至上,就是說要聯絡上層就必須經過下層,因此有時候看起來就像層與層之間的聯絡並沒有經過底層一樣。同時還應注意每一層的作用,以及不同協議的層次數量可能不同,如tcp/ip協議就是四層協議。這裡要注意tcp/ip協議的應用程式層中的http協議,這是網路編程的重中之重,因為應用程式層負責程式間的互動。
tcp/ip協議只有四層協議,分別是應用程式層,傳輸層,互連網絡層,網路介面層。其中應用程式層用於程式間的訪問,有http協議(超文字傳輸通訊協定 (HTTP))網路通訊規則,遵循請求/響應模型。傳輸層遵循tcp,udp等協議負責資料轉送。網路互聯層有ip協議(即互連網協議),他保證資料能傳到目的地址(即確定資料一定是到達了,否則重發)。網路介面層負責實際的網路媒體的管理(網線等裝置)。
tcp/ip協議http協議都是基於socket的,大部分的網路應用程式都是點對點的,點就是指的伺服器和用戶端的程式。
http協議等應用於應用程式層的協議是最常見的協議,我們常說的協議往往就是指他們,因為實際上編程時我們關心的最多的就是應用程式層的協議,因為其他的特別是較底層的協議實際上是很少用到的,因為在編程時底層的東西其實很多並不需要我們進行修改,而是已經封裝好的,如tcp協議,ip協議等(但是真正的高手因應該瞭解,以便定製自己的底層協議或者入侵他人電腦)。也就是說,實際上大多情況下使用的都是應用程式層的協議進行的編程,只是若想控制整個網路系統就得會操作所有層。應用程式層有較多的協議,常見的有http,smtp,mime等。(http,udp,tcp都是基於socket概念為某類情境而擴充出的傳輸協議)(http中的瀏覽器預設連接埠為80,)
若是單純的進行網路通訊,則利用socket以及基於socket擴充而來的各種協議即可,因為這隻是涉及到資料以及一些指令的傳輸(歸根到底就是資料轉送),但是電腦科學是發展的,如果將很所的功能全加到一部電腦上的話,那麼對於電腦本身的要求就會變得越來越高,但是在科學無法讓一台電腦實現大量功能的情況下,使用分布式服務架構將功能分散到其他的電腦上是個不錯的方法,這樣就可以降低成本,整合可以利用的資源,但同時就需要提供一個相互調用各自資源的穩定的方法,因此就誕生了分布式服務架構,這個架構最大的特點就是各自的電腦可以調用其他的電腦的方法,相當於將某個電腦看成是黑匣子,一個提供特定的方法的黑匣子,而我們不需要關心這個黑匣子究竟是怎麼實現方法的。因此除了java.net,android.net,之外還要懂得遠端程序呼叫RPC,遠程方法調用RMI,因此還需要掌握java.rmi等相關包的方法。
RPC直接通過網路請求遠端電腦上的服務而不需要瞭解電腦上的協議,他假設某協議存在,即RPC跨越了應用程式層和傳輸層。(RPC支援多種語言,RMI只支援java)RPC不支援對象,傳遞到RPC的訊息必須經過外部資料語言表示XDR(external data representation)語言表示,XDR抽象了位元組序類與資料類型結構之間的差異,並且RPC只能傳遞XDR表示的資料結構。(可以說RMI就是物件導向的java RPC)(順便說一下,位元組序指的是位元組資料存放區的順序,有兩種LE little
endian與BE big endian,從左至右,前者由小到大,後者有大到小,後者是最自然的形式,同時也是網路儲存的形式。)
其實RPC更多地體現為一種思想,一種最常用的設計形式,即像策略模式一樣,通過實現具體的網路類,再調用這個網路類的方法,這樣就實現了遠程對象,遠程方調用。所以其實可以說這個網路類代表了要調用的程式而被操作。
JMS是javaMessage Service,是一種允許應用程式建立,接受,發送,讀取訊息的java API,但是與RMI不同,JMS將對象非同步從一個JVM傳給另一個JVM,而RMI則是只能傳遞參數與傳回值,RMI本身是被綁定在自身的JVM中的。
在分布式服務架構中,最基本的問題就是通訊問題,java底層領域有很多實現的技術,並且還對底層領域的技術進行過封裝,先掌握基本的幾種技術(java底層通訊技術有RMI,EJB,JMS,ESB,MINA,BORLAP,SOAP。封裝的有HESSION,AXIS,XFIRE,HTTPINVOLKER。需要掌握的有RMI,XML-RPC,BINARY-RPC,JMS)。通訊技術是基於傳輸協議和網路IO實現的,傳輸協議是tcp,http之類的,網路IO是nio之類的,但是考慮到應用的易用,各種語言都提供了一些更加貼近應用易用的應用程式層協議,java中最知名的遠程通訊協定有:RMI,XML-RPC,BINARY-RPC,SOAP,JMS。
SOAP簡易物件存取通訊協定 (SOAP),是一種簡單,輕量,基於XML的協議。簡易物件存取通訊協定 (SOAP)被設計用於web上進行結構化和固化資訊的交換,是webService三要素之一,SOAP用來傳遞資訊的格式(就是所要進行傳送的資料包的格式)。
nio,bio,aio,bio是我們平時使用的io,如InputStream,nio是new io的意思,連同aio使用的類都是使用的nio上面的類。同時作為網路傳輸的話,與傳輸協議進行匹配的話,有四種情況,分別是tcp/ip+bio,tcp/ip+nio,udp/ip+bio,udp/ip+nio,這種劃分應該說是一種思想,但是實際上使用的時候使用的都是類。實際上就性質上講他們還是io,只是使用的領域不大一樣而已,但是只是類的變化而已。關鍵在於udp/ip的話,使用的是資料包技術,因此使用的類名中都含有datagram,tcp/ip一般就沒有類名設定,同時,bio一般就是使用的socket,nio使用的是channel,至於aio則是使用的nio的類,但它的類有一個asynchronous,總的來說這些編程的類都存在於java.io,java.nio這兩個包中(java.nio包的其實大多數都在java.nio.channels裡面)。
RMI遠程方法調用,在這之前我們應該瞭解另外一個概念RPC遠端程序呼叫,RMI就屬於RPC,RMI用於調用遠程對象的過程,(Runtime中的getRuntime().exec()方法能操作指令,但是自由度並不高並不能說是真正意義上的遠程方法調用)RMI是一個介面,有自己的專門的包,在此基礎上進行瞭解即可。rpc其實更多情況下是作為一個概念存在,因此才會有使用到他的思想的相關類的命名都加入rpc以表明使用了rpc思想指導設計。
URLConnection與URL的網路編程最終還是歸於tcp協議的。
網路編程實際上使用的是最後有兩條線路,一是URLConnection與URL的網路編程,二是socket與c/s的編程。
其實網路的方面相對於網頁設計來說相對較為簡單,就是以上出現的各類的應用以實現實際上所想要的資料轉送功能為目的進行的編程。