程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java socket編程入門[1]

Java socket編程入門[1]

編輯:關於JAVA

Java socket編程入門[1]

[原創] Robinh00d 2004-02-19

--------------------------------------------------------------------------------

本教程由IBM DevelopWorks提供,版權歸IBM所有

原作:Roy Miller 翻譯:Robinh00d[CSTC]

翻譯本文的目的僅僅是為了練習,本教程版權歸IBM所有,本人不對其擁有版權

第一章:學習提示

我適合學習這份教程嗎

Socket提供了兩台計算機之間進行通訊的機制,在James Gosling注意Java語言之前就已經很聞名了。Java語言使你更簡單有效的使用Socket開發而無需了解操作系統的底層機制。大部分討論Java編碼的書籍都沒有涉及這一主題,或者是只是“點到為止”,留給讀者大量的想象空間。這份教程就是讓你了解在你的Java代碼中如何更有效的使用Socket所需的知識。包含以下內容:

"什麼是Socket

"它位於你的應用程序的哪些地方

"能正常運行的最簡單的Socket例程――幫助你理解Java Socket的基礎知識

"詳細剖析另外兩個探討如何在多線程和具有連接池環境中使用套接字的示例

"簡要討論在現實世界中的一個Socket應用程序

如果你能夠描述如何使用Java.Net這個包裡的類,這份教程對你來說也許基礎了一點。盡管它是一份提高技術的好資料,但是如果你已經在PC或者其他平台上有過長期Socket的開發經歷,這部分提示也許會讓你產生厭煩,但是如果你並不是很理解Socket,並且只想知道“什麼是Socket”以及“怎麼將Socket應用在自己的Java代碼中”的話,這份教程則是一個很好的開始。

第二章:Socket基礎

介紹

大多程序員,無論是否使用Java語言編程,都不希望知道太多關於不同的計算機之間相互通信的底層知識。程序員希望處理更容易理解的高層抽象。程序員更希望用他們熟悉的Java的構造,通過直觀接口與對象交互。

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類。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved