Java socket編程入門[1]
來源:互聯網
上載者:User
編程 第一章:學習提示
我適合學習這份教程嗎
Socket提供了兩台電腦之間進行通訊的機制,在James Gosling注意Java語言之前就已經很聞名了。Java語言使你更簡單有效使用Socket開發而無需瞭解作業系統的底層機制。大部分討論Java編碼的書籍都沒有涉及這一主題,或者是只是“點到為止”,留給讀者大量的想象空間。這份教程就是讓你瞭解在你的Java代碼中如何更有效使用Socket所需的知識。包含以下內容:
•什麼是Socket
•它位於你的應用程式的哪些地方
•能正常啟動並執行最簡單的Socket常式――協助你理解Java Socket的基礎知識
•詳細剖析另外兩個探討如何在多線程和具有串連池環境中使用通訊端的樣本
•簡要討論在現實世界中的一個Socket應用程式
如果你能夠描述如何使用java.net這個包裡的類,這份教程對你來說也許基礎了一點。儘管它是一份提高技術的好資料,但是如果你已經在PC或者其他平台上有過長期Socket的開發經曆,這部分提示也許會讓你產生厭煩,但是如果你並不是很理解Socket,並且只想知道“什麼是Socket”以及“怎麼將Socket應用在自己的Java代碼中”的話,這份教程則是一個很好的開始。
第二章:Socket基礎
介紹
大多程式員,無論是否使用Java語言編程,都不希望知道太多關於不同的電腦之間相互連信的底層知識。程式員希望處理更容桌斫獾母卟慍橄蟆3絛蛟備M盟鞘煜さ膉ava的構造,通過直觀介面與對象互動。
Socket存在於兩個領域--我們寧願處理抽象層而避免涉及底層細節,這一章所講解的底層細節僅用於你理解抽象應用所必須的知識。
電腦群組網
電腦之間用一種非常簡單的方式來進行操作和通訊。電腦晶片是一種開關,用1和0來儲存和傳輸資料。當電腦希望共用資料時,它們需要所作的全部就是以相同的速度,相同的順序,相同的時間等來回傳輸上百萬的資料流。當你想在兩個應用程式之間通訊時,你怎麼想考慮這些細節呢?
為了避免上面提到的事情,我們每次需要一組包協議用同樣的方法來完成工作。這將使我們能夠處理應用程式級的工作而不需要擔心底層網路技術的細節。這樣設定的包協議被稱作“棧”。TCP/IP是最常見的協議棧。大部分協議棧(包括TCP/IP)都大致遵循ISO國際標準組織的開放系統互相連線模型參考模型(Open Systems Interconnect Reference Model,OSIRM)。OSIRM把電腦網路定義為7個邏輯層
(見下圖)很多公司對於這個模型的某些層的構造有過貢獻。從產生電子訊號()到給應用程式提供資料。TCP/IP映射到OSI模型的兩層,如圖所示。
我們不必過多的深入這些層的細節,但我們應該知道socket位於模型的什麼位置。
Socket存在於哪些地方?
Socket大致位於OSI模型的會話層(下圖),會話層夾在面嚮應用的高層(上)的層和即時資料通訊層(下)之間。會話層在兩台電腦之間為管理和控制資料流提供服務。作為這一層的一部分,socket提供一個隱藏從傳輸線上擷取bytes和bits的複雜性的抽象。換言之,socket允許我們讓應用程式表示它想發送bytes。
socket隱藏了完成該工作的具體細節。
當你拿起電話說話時,電話把你的聲音轉換電訊號。電話機是人和電信網路之間的介面。你不必知道你的聲音是如何轉換的細節,只需知道要你想和誰聯絡。同樣的道理,socket隱藏了複雜的傳輸位元據而扮演高層介面的角色。
向一個應用程式曝光socket
當你在使用socket編寫代碼時,你的代碼工作在展示層。展示層提供一個能讓應用程式層使用的公用資訊表示(representation of information)。假如你想把你的應用程式串連到CC銀行系統而僅能使用EBCDIC。你的域對象(domain objects)用ASCII格式儲存資訊。既然這樣,你得負責在展示層編寫代碼把EBCDIC的資料轉換成ASCII格式,然後(比如)嚮應用層提供一個域對象(domain objects)。應用程式層可以用域對象(domain objects)做它想做的任何事情。
你編寫的socket處理代碼僅存在於展示層。應用程式層並不需要知道socket如何工作。
什麼是socket?
現在我們知道了socket扮演的角色,那麼剩下的問題就是:什麼是socket?Bruce Eckel在他的《Java編程思想》一書中是這樣描述socket的:
socket是一種用於表達兩台機器之間串連“終端”的軟體抽象。對於一個給定的串連,在每台機器上都有一個socket,你可以想象一個虛擬"電纜"工作在兩台機器之間,“電纜”插在兩台機器的socket上。當然,物理硬體和兩台機器之間的“電纜”這些串連裝置都是未知的,抽象的所有目的就是為了讓我們不必瞭解更多的細節。
簡單的說,一台電腦上的socket同另一台電腦通話建立一個通訊通道,程式員可以用這個通道在兩台機器之間發送資料。當你發送資料時,TCP/IP協議棧的每一層都給你的資料裡添加適當的前序。有個好訊息是java語言隱藏了所有這些細節,這也是為什麼他們有時被叫做“流socket”。
思考一下socket像電話耳機一樣在電話的任意一端--你和我通過一個專門的通道來進行通話和接聽。會話將一直進行下去直到我們決定掛斷電話(除非我們使用蜂窩電話),除非我們掛斷電話,否則我們各自的電話線路都會佔線。
如果你需要在兩台機器之間進行通訊而不使用進階機制像ORBs(以及CORBA, RMI, IIOP等等),socket比較適合你。Socket的底層機制則相當棘手。幸運的是,java平台給我們一些雖然簡單但是相當強大的高層抽象以至於我們建立和使用socket更加容易一些。
socket的類型
一般而言,java socket有下面兩種類型:
•TCP socket(由Socket類實現,下面的章節我們將對其討論)
•UDP socket(由DatagramSocket類實現)
TCP和UDP扮演同樣的角色,但是實現是不同的。兩者都接收傳輸協議資料包並把它們傳遞到展示層。TCP把資訊分解成資料包(datagrams)並在接收端重新組裝起來。它還對丟失的資料包進行重新傳輸的請求。TCP減少了上層的擔憂。UDP沒有組裝和重傳請求的功能。它只是傳輸資料包。更高層的層必須確保資訊的完整性以及組合順序的正確性。
一般而言,UDP使你的應用程式更有效率,但只在你的應用程式並不是立即交流大量資料並且不需要組裝大量的資料報而完成一條訊息的時候。否則TCP才是最簡單和最有效選擇。
因為大部分讀者相對於UDP來說更喜歡用TCP一些,我們將我們的討論限定在java語言中面向TCP類。