一、 客戶端網路編程步驟
客戶端(Client)是指網路編程中首先發起連接的程序,客戶端一般實現程序界面和基本邏輯實現,在進行實際的客戶端編程時,無論客戶端復雜還是簡單,以及客戶端實現的方式,客戶端的編程主要由三個步驟實現:
1、 建立網路連接
客戶端網路編程的第一步都是建立網路連接。在建立網路連接時需要指定連接到的伺服器的IP地址和埠號,建立完成以後,會形成一條虛擬的連接,後續的操作就可以通過該連接實現數據交換了。
2、 交換數據
連接建立以後,就可以通過這個連接交換數據了。交換數據嚴格按照請求響應模型進行,由客戶端發送一個請求數據到伺服器,伺服器反饋一個響應數據給客戶端,如果客戶端不發送請求則伺服器端就不響應。
根據邏輯需要,可以多次交換數據,但是還是必須遵循請求響應模型。
3、 關閉網路連接
在數據交換完成以後,關閉網路連接,釋放程序佔用的埠、內存等系統資源,結束網路編程。
最基本的步驟一般都是這三個步驟,在實際實現時,步驟2會出現重復,在進行代碼組織時,由於網路編程是比較耗時的操作,所以一般開啟專門的現場進行網路通訊。
二、伺服器端網路編程步驟
伺服器端(Server)是指在網路編程中被動等待連接的程序,伺服器端一般實現程序的核心邏輯以及數據存儲等核心功能。伺服器端的編程步驟和客戶端不同,是由四個步驟實現,依次是:
1、 監聽埠
伺服器端屬於被動等待連接,所以伺服器端啟動以後,不需要發起連接,而只需要監聽本地計算機的某個固定埠即可。
這個埠就是伺服器端開放給客戶端的埠,伺服器端程序運行的本地計算機的IP地址就是伺服器端程序的IP地址。
2、 獲得連接
當客戶端連接到伺服器端時,伺服器端就可以獲得一個連接,這個連接包含客戶端的信息,例如客戶端IP地址等等,伺服器端和客戶端也通過該連接進行數據交換。
一般在伺服器端編程中,當獲得連接時,需要開啟專門的線程處理該連接,每個連接都由獨立的線程實現。
3、 交換數據
伺服器端通過獲得的連接進行數據交換。伺服器端的數據交換步驟是首先接收客戶端發送過來的數據,然後進行邏輯處理,再把處理以後的結果數據發送給客戶端。簡單來說,就是先接收再發送,這個和客戶端的數據交換數序不同。
其實,伺服器端獲得的連接和客戶端連接是一樣的,只是數據交換的步驟不同。
當然,伺服器端的數據交換也是可以多次進行的。
在數據交換完成以後,關閉和客戶端的連接。
4、 關閉連接
當伺服器程序關閉時,需要關閉伺服器端,通過關閉伺服器端使得伺服器監聽的埠以及佔用的內存可以釋放出來,實現了連接的關閉。
其實伺服器端編程的模型和呼叫中心的實現是類似的,例如移動的客服電話10086就是典型的呼叫中心,當一個用戶撥打10086時,轉接給一個專門的客服人員,由該客服實現和該用戶的問題解決,當另外一個用戶撥打10086時,則轉接給另一個客服,實現問題解決,依次類推。
在伺服器端編程時,10086這個電話號碼就類似於伺服器端的埠號碼,每個用戶就相當於一個客戶端程序,每個客服人員就相當於伺服器端啟動的專門和客戶端連接的線程,每個線程都是獨立進行交互的。
這就是伺服器端編程的模型,只是TCP方式是需要建立連接的,對於伺服器端的壓力比較大,而UDP是不需要建立連接的,對於伺服器端的壓力比較小罷了。
Ⅱ 淺談Java中如何利用socket進行網路編程(一)
Socket是網路上運行的兩個程序間雙向通訊的一端,它既可以接受請求,也可以發送請求,利用它可以較為方便的編寫網路上的數據的傳遞。在java中,有專門的socket類來處理用戶的請求和響應。利用SOCKET類的方法,就可以實現兩台計算機之間的通訊。這里就介紹一下在JAVA中如何利用socket進行網路編程。 在Java中Socket可以理解為客戶端或者伺服器端的一個特殊的對象,這個對象有兩個關鍵的方法,一個是getInputStream方法,另一個是getOutputStream方法。getInputStream方法可以得到一個輸入流,客戶端的Socket對象上的getInputStream方法得到的輸入流其實就是從伺服器端發回的數據流。GetOutputStream方法得到一個輸出流,客戶端Socket對象上的getOutputStream方法返回的輸出流就是將要發送到伺服器端的數據流,(其實是一個緩沖區,暫時存儲將要發送過去的數據)。 程序可以對這些數據流根據需要進行進一步的封裝。本文的例子就對這些數據流進行了一定的封裝(關於封裝可以參考Java中流的實現部分)。 一、建立伺服器類 Java中有一個專門用來建立Socket伺服器的類,名叫ServerSocket,可以用伺服器需要使用的埠號作為參數來創建伺服器對象。ServerSocket server = new ServerSocket(9998) 這條語句創建了一個伺服器對象,這個伺服器使用9998號埠。當一個客戶端程序建立一個Socket連接,所連接的埠號為9998時,伺服器對象server便響應這個連接,並且server.accept()方法會創建一個Socket對象。伺服器端便可以利用這個Socket對象與客戶進行通訊。Socket incoming = server.accept() 進而得到輸入流和輸出流,並進行封裝BufferedReader in = new BufferedReader(new InputStreamReader(incoming.getInputStream())); PrintWriter out = new PrintWriter(incoming.getOutputStream(),true); 隨後,就可以使用in.readLine()方法得到客戶端的輸入,也可以使用out.println()方法向客戶端發送數據。從而可以根據程序的需要對客戶端的不同請求進行回應。
Ⅲ Java網路編程從入門到精通(6):使用getCanonicalHostName方法獲得主機名
getCanonicalHostName方法和getHostName方法一樣 也是得到遠程主機的域名 但它們有一個區別 getCanonicalHostName得到的是主機名 而getHostName得到的主機別名 getCanonicalHostName的定義如下
()
在訪問某些域名時 getCanonicalHostName方法和getHostName方法的返回值是一樣的 這和DNS伺服器如何解釋主機名和主機別名以及它們的設置有關 如通過創建InetAddress對象後 使用getCanonicalHostName方法和getHostName方法返回的結果都是(有時直接返回IP地址 這可能和IBM的DNS伺服器的處理機制有關岩游弊) 如果DNS不允許通過IP地址得到域名 那麼這兩個方法就會返回IP地址來代替域名 getCanonicalHostName方法可以分三種情況來討論
使用getLocalHost創建InetAddress對象
在粗族這種情況下getCanonicalHostName方法和getHostName方法得到的都是本機名
使用域名創建InetAddress對象
在這種情況下 getCanonicalHostName方法是否要訪問DNS伺服器 取決於DNS伺服器如何解釋主機名和主機別名 也就是說 是否在創建InetAddress對象時就將主機名和主機別名都確定了 在前面已經講過 使用域名創建InetAddress對象後 調用getHostName方法不會訪問DNS伺服器 但getCanonicalHostName方法就不一定了 這和DNS伺服器的設置有關 如就需要訪問DNS伺服器 而就不需要訪問DNS伺服器
使用IP地址創建InetAddress對象
在這種情況下 getCanonicalHostName方法和getHostName方法是完全一樣的 也就是說 它們得到的都是主機名 而不是主機別名
之所以要使用主機別名 是因為有時主機名可能比較復雜 如Oracle官方網站的主機名bigip o 因此 為了使用戶訪問網站更方便 就增加了更簡單的主機別名 如 一個主機名可能對應多個主機別名 如也是Oracle的主機別名 在IE的地址欄中輸入和都可以訪問Oracle官方網站 但我們發現 有很多網站通過主機名無法訪問 只有通過一些別名才能訪問 如 只能通磨冊過和兩個主機別名訪問 而不能通過它的主機名 cn來訪問 這是因為在服務端通過HTTP協議做了限制 這個在前面已經討論過了 常式 對比了getCanonicalHostName和getHostName方法在不同情況下的輸出結果
package mynet;import *;publicclass DomainName{publicstaticvoidoutHostName(InetAddressaddress Strings){System out println( 通過 +s+ 創建InetAddress對象 );System out println( 主機名: +address getCanonicalHostName());System out println( 主機別名: +address getHostName());System out println( );}publicstaticvoidmain(String[]args)throwsException{outHostName(InetAddress getLocalHost() getLocalHost方法 );outHostName(InetAddress getByName( ) );outHostName(InetAddress getByName( ) );outHostName(InetAddress getByName( ) );outHostName(InetAddress getByName( ) );}}
運行結果
通過getLocalHost方法創建InetAddress對象主機名:ComputerName主機別名:ComputerName通過創建InetAddress對象主機名:主機別名:通過創建InetAddress對象主機名: cn主機別名:通過 創建InetAddress對象主機名: cn主機別名: cn通過 創建InetAddress對象主機名: 主機別名:
lishixin/Article/program/Java/hx/201311/26659
Ⅳ Java網路編程從入門到精通(12):使用isReachable方法探測主機是否可以連通
在J SE 中的InetAddress類中增加了一個isReachable方法 可以使用這個方法來探測主機是否可以連通 這個方賣山隱法有兩個重載形式 它們的定義如下
publicbooleanisReachable(int唯肆timeout)(NeorkInterfacenetif intttl inttimeout)throwsIOException
第一個重載形式有一個timeout參數 可以通過這個參數設置連接超時(單位 毫秒) 第二個重載形式多了兩個參數 netif和ttl 通過netif參數可以使用一個NeorkInterface對象來確定客戶端使用哪個網路介面來測試主機的連通性 ttl是指測試連通性過程中的最大連接躍點數(從客戶機到達遠程主機所經過的最大路由數就是最大連接躍點數 一個路由被稱為一個躍點 在Windows網路連接中的 高級TCP/IP設置 對話框最下面可以設置介面躍點數) 如果達到最大連接躍點數 還沒找到遠程主機 isReachable方法就認為客戶機和遠程主機之間是不可連通的
isReachable方法是通過連接主機的echo埠來確定客戶端中廳和服務端是否可連通 但在Internet上使用這個方法可能會因為放火牆等因素而無法連通遠程主機(實際上 遠程主機是可以連通的) 因此 isReachable在Internet上並不可靠 但我們可以將isReachable方法應用於區域網中
lishixin/Article/program/Java/hx/201311/27058
Ⅳ 如何學習網路編程
學習網路編程可以從以下幾個步驟進行:
選擇合適的編程語言:
掌握基礎概念:
理解C/S模型:
學習Socket API:
實踐Socket編程:
學習I/O模型:
深入學習:
提高編程效率:
拓展知識:
持續學習與實踐: