網路程式設計
Java本身對網路的支援相當的完整,對於網路上傳輸的資料也都可以透過JavaIO豐富的串流介面來進行操作,但在進行網路程式設計前,必須先了解一些網路運作的基本概念,有許多使用者在學習撰寫網路程式時時,常會遇到一些莫名的問題,這些問題大多都是因為對網路的觀念熟所造成,在加上資料在網路上傳遞是無形的,若不了解一些網路基本運作的觀念,便不容易理解問題是出在那個環節上。網路通訊的基礎概念包括兩台電腦之間如何進行連線,彼此如何進行溝通,所使用的通訊協定種類等議題。
- 建立連線
網路程式簡單的說就是可以連接兩台不同電腦,讓兩個電腦之間的應用程式彼此能夠互相溝通。但網路上的電腦那麼多,要怎麼才能找到所要連結的電腦呢?再說一台電腦上執行的網路應用程式那麼多個,又要如何才能把資料傳遞給所要連結的應用程式呢?讓我們把這個問題轉個方向來思考,電腦就如同現實生活中的公司機關,而電腦中的不同應用程式就如同每間公司中擁有許多不同的部門,今天若我們希望與某間公司中某個部們的某個員公連絡,只需知道該公司的電話號碼在撥通後,在輸入該部門員工的分機號碼,就可以與該員工進行溝通。所以說網路就像真實世界的縮影,只是電話號碼變成網路位址(IP Address),分機號碼則變成成連接埠號(Port Number),所以說當兩台不同電腦之間的應用程式彼此要進行溝通,只需知道對方的網路位置(如同電話號碼)與該應用程式的連接埠號(分機號碼),在將資料發送到網際網路上(如同透過電信系統),就能與對方電腦中的應用程式進行溝通連線,至於中途資料是如何進行傳遞就如同電信系統將你所撥的電話轉發到對方的電話上,是由一套複雜的運作機制所達成,在這裡就不在多做說明,讀著若有興趣可以參考一些有關介紹router方面的書藉。
- 進行溝通
在成功的與其他網路應用用程式進行連線後,在來的問題就是彼此之間要如何進行溝通,因為對方的應用程式未必看的懂我們傳遞過去的資料格式或所代表的義意,同樣的對方回傳的資料我們也未必了解。這就如同在現實生活中我們使用各種語言來與人進行溝通,唯當對方聽的懂你所說的語言,才能了解你所要表達的義意,而在網路世界中我們稱這類讓彼此能夠溝通的方式為協定,不同的協定之間其實也是可以進行溝通,只是兩者之間必須透過一個中界裝置進行協定內容的轉換,這個裝置必須同時了解兩邊所使用的協定,這就如同現實生活中我們可以找翻釋人員來進行翻釋。
- 通訊協定
在網路資料傳輸中主要使用的協定為TCP與UDP,TCP是一種連線導向的通訊協定,在進行資料傳輸時兩者必須先建立連線,並且中間資料傳輸過程是具有可靠性的,UDP則是一種非連線導向的通訊協定,這種協定在進行資料傳輸前並不必先建立連線,並且資料的傳輸不具有可靠性,就算資料在中途遺失了,傳輸端也不會受到通知。TCP與UDP都是建構在IP協定上,一般而言TCP/IP為網路中最常見的通訊協定,UDP則大多使用在影響傳輸這類需要快速的傳輸速度且對資料的可靠性要求並不高的應用上。
- Socket 與 ServerSocket
要利用網路來傳輸資料前,必須要先了解插座(Socket)與連接埠(Port)的使用方式,我們可以把插座看成一條無形延申的連接線,我們可以在該線上開許多的連接孔(Port),每個連接乳皆對應一個服務程式,並且給予每個連接孔一個代號,當網路上有其他電腦希望與我們連線時,便可以透過IP位置找到這條連手接線,接著在去尋找所希望連線的服號程式孔號,就可以建立起連線服務。ServerSocket則是Server端建立連線服務的工具,此類別可提供Server端建立一個TCP連線服務,因此必須要指定該服務的Port號碼,以供其他Client 端透過Socket進行連線。Java主要是利用Socket類別與ServerSocket類別做為Client與Server之間建立Socket連線的管道,以下為這兩個類別的建構方式,與常用的方法介紹:
- Socket類別建構式
- Socket()建立未連線的Socket。
- Socket(InetAddress address, int port)與指定的IP位置與連接埠(Port)建立Socket連線。
- Socket(InetAddress host, int port, boolean stream)己被棄置不建議使用。
- Socket(InetAddress address, int port, InetAddress localAddr, int localPort)建立Socket連線,並同時指定本地端與遠端的IP位置與連接埠(Port )。
- Socket(SocketImpl impl)使用指定的impl建立一個未連線的Socket。
- Socket(String host, int port)與指定的host和連接埠(Port)建立Socket連線。
- Socket(String host, int port, boolean stream)己被棄置不建議使用。
- Socket(String host, int port, InetAddress localAddr, int localPort)建立Socket連線,並同時指定本地端與遠端的Host name與連接埠(Port )。
Socket的方法
ServerSocket類別建構式
- ServerSocket()建立未連線的ServerSocket。
- ServerSocket(int port)依指定的port建立ServerSocket連線。
- ServerSocket(int port, int backlog)依指定的port建立ServerSocket連線,並限定連線人數。
- ServerSocket(int port, int backlog, InetAddress bindAddr)依指定的IP位置與port建立ServerSocket連線,並限定連線人數。
TCP多人網路聊天室設計
在本章的最後將利用一個多人網路聊天室來做個總結,本範例程式由以下三隻類別與一隻介面所組成:
類別名稱 | 說明 |
---|---|
Server.java | Server端程式,支援多執行緒,最多可接受十組Socket連線請求。負責轉送訊息至線上所有Client端。 |
Client.java | Client端程式,支援多執行緒讀寫處理,可同時處理由Server送至Client端的訊息,與Client端送至Server端的訊息。 |
SocketIO.java | 處理Socket的輸出輸入串流,繼承至BasicIO介面。 |
介面名稱 | 說明 |
BasicIO.java | 該介面定義讀取、寫出與登出三種方法。 |
本範例程式結合了例外處理、網路連線、物件導向、多執行緒等,前幾章所介紹過的主題,雖然程式看起來較為複雜,可是卻能將上述各種主題做個整合應用,因此筆者建議讀者應詳細的研讀。在網路程式設計中,最好的應用例子就是網路聊天室,本聊天室架構如下圖所示:A電腦做為聊天室Server負責,B電腦、C電腦與D電腦可同時請求登入聊天室Server,隨後B電腦發送一串訊息至Server上,經由Server再將該訊息轉發至C、D電腦上,反之亦然。提供一個多人可以同時於線上一起交談的環境。為了不讓程式過於複雜化,Server端僅會負責使用者登入登出與訊息的傳播,讀者若有興趣可以自行加強Server所能處理的任務,做為練習的題材。
圖 417 聊天室架構
接下來利用以下的一個簡單的多人聊天室範例:
【程式碼】Server.java
//Server.java 線上聊天室 Server端 |
---|
【程式碼】BasicIO.java
import java.io.IOException; |
---|
【程式碼】SocketIO.java
//SocketIO.java 處理Socket IO Stream |
---|
【程式碼】Client.java
//Client.java 線上聊天室 Client端 |
---|
【執行結果】Server端
圖 418 Server端執行畫面
圖 419 Client B執行畫面
圖 420 Client C執行畫面
圖 421 Client D執行畫面