導航:首頁 > 編程語言 > java網路編程從入門到精通

java網路編程從入門到精通

發布時間:2023-05-21 12:22:31

java網路編程從入門到精通(33):非阻塞I/O的緩沖區(Buffer)

如果將同步I/O方式下的數據傳輸比做數據傳輸的零星方式(這里的零星是指在數據傳輸的過程中是以零星的位元組方式進行的) 那麼就可以將非阻塞I/O方式下的數據傳輸比做數據傳輸的集裝箱方式(在位元組和低層數據傳輸之間 多了一層緩沖區 因此 可以將緩沖區看做是裝載位元組的集裝箱) 大家可以想像 如果我們要運送比較少的貨物 用集裝箱好象有點不太合算 而如果要運送上百噸的貨物 用集裝箱來運送的成本會更低 在數據傳輸過程中也是一樣 如果數據量很小時 使用同步I/O方式會更適合 如果數據量很大時(一般以G為單位) 使用非阻塞I/O方式的效率會更高 因此 從理論上說 數據量越大 使用非阻塞I/O方式的單位成本就會越低 產生這種結果的原因和緩沖區的一些特性有著直接的關系 在本節中 將對緩沖區的一些主要特性進行講解 使讀者可以充分理解緩沖區的概念沖森 並能通過緩沖區來提高程序的執行效率

創建緩沖區

Java提供了七個基本的緩沖區 分別由七個類來擾判拍管理 它們都可以在java nio包中找到 這七個類如下所示

ByteBuffer

ShortBuffer

IntBuffer

CharBuffer

FloatBuffer

DoubleBuffer

LongBuffer

這七個類中的方法類似 只是它們的返回值或參數和相應的簡單類型相對應 如ByteBuffer類的get方法返回了byte類型的數據 而put方法需要一個byte類型的參數 在CharBuffer類中的get和put方法返回和傳遞的數據類型就是char 這七個類都沒有public構造方法 因此 它們不能通過new來創建相應的對象實例 這些類都可以通過兩種方式來創建相應的對象實例

通過靜態方法allocate來創建緩沖區

這七類都有一個靜態的allocate方法 通過這個方法可以創建有最大容量限制的緩沖區對象 allocate的定義如下

ByteBuffer類中的allocate方法

(intcapacity)

IntBuffer類中的allocate方法

publicstaticIntBufferallocate(intcapacity)

其他五個緩沖區類中的allocate 方法定義和上面的定義類似 只是返回值的類型是相應的緩沖區緩羨類

allocate方法有一個參數capacity 用來指定緩沖區容量的最大值 capacity的不能小於 否則會拋出一個IllegalArgumentException異常 使用allocate來創建緩沖區 並不是一下子就分配給緩沖區capacity大小的空間 而是根據緩沖區中存儲數據的情況來動態分配緩沖區的大小(實際上 在低層Java採用了數據結構中的堆來管理緩沖區的大小) 因此 這個capacity可以是一個很大的值 如 * ( M) allocate的使用方法如下

ByteBufferbyteBuffer=ByteBuffer allocate( );IntBufferintBuffer=IntBuffer allocate( );

在使用allocate創建緩沖區時應用注意 capacity的含義隨著緩沖區的不同而不同 如創建位元組緩沖區時 capacity指的是位元組數 而在創建整型(int)緩沖區時 capacity指的是int型值的數目 如果轉換成字數 capacity的值應該乘 如上面代碼中的intBuffer緩沖區最大可容納的位元組數是 * = 個

通過靜態方法wrap來創建緩沖區

使用allocate方法可以創建一個空的緩沖區 而wrap方法可以利用已經存在的數據來創建緩沖區 wrap方法可以將數組直接轉換成相應類型的緩沖區 wrap方法有兩種重載形式 它們的定義如下

ByteBuffer類中的wrap方法

publicstaticByteBufferwrap(byte[]array)publicstaticByteBufferwrap(byte[]array intoffset intlength)

IntBuffer類中的wrap方法

publicstaticIntBufferwrap(byte[]array)publicstaticIntBufferwrap(byte[]array intoffset intlength)

其他五個緩沖區類中的wrap 方法定義和上面的定義類似 只是返回值的類型是相應的緩沖區類

在wrap方法中的array參數是要轉換的數組(如果是其他的緩沖區類 數組的類型就是相應的簡單類型 如IntBuffer類中的wrap方法的array就是int[]類型) offset是要轉換的子數組的偏移量 也就是子數組在array中的開始索引 length是要轉換的子數組的長度 利用後兩個參數可以將array數組中的一部分轉換成緩沖區對象 它們的使用方法如下

byte[]myByte=newbyte[]{ };int[]myInt=newint[]{ };ByteBufferbyteBuffer=ByteBuffer wrap(myByte);IntBufferintBuffer=IntBuffer wrap(myInt );

可以通過緩沖區類的capacity方法來得到緩沖區的大小 capacity方法的定義如下

publicfinalintcapacity()

如果使用allocate方法來創建緩沖區 capacity方法的返回值就是capacity參數的值 而使用wrap方法來創建緩沖區 capacity方法的返回值是array數組的長度 但要注意 使用wrap來轉換array的字數組時 capacity的長度仍然是原數組的長度 如上面代碼中的intBuffer緩沖區的capacity值是 而不是

除了可以將數組轉換成緩沖區外 也可以通過緩沖區類的array方法將緩沖區轉換成相應類型的數組 IntBuffer類的array方法的定義方法如下(其他緩沖區類的array的定義類似)

publicfinalint[]array()

下面的代碼演示了如何使用array方法將緩沖區轉換成相應類型的數組

int[]myInt=newint[]{ };IntBufferintBuffer=IntBuffer wrap(myInt );for(intv:intBuffer array()) System out print(v+ );

在執行上面代碼後 我們發現輸出的結果是 而不是 這說明在將子數組轉換成緩沖區的過程中實際上是將整個數組轉換成了緩沖區 這就是用wrap包裝子數組後 capacity的值仍然是原數組長度的真正原因 在使用array方法時應注意 在以下兩種緩沖區中不能使用array方法

只讀的緩沖區如果使用只讀緩沖區的array方法 將會拋出一個ReadOnlyBufferException異常

使用allocateDirect方法創建的緩沖區

如果調用這種緩沖區中的array方法 將會拋出一個UnsupportedOperationException異常

可以通過緩沖區類的hasArray方法來判斷這個緩沖區是否可以使用array方法 如果返回true 則說明這個緩沖區可以使用array方法 否則 使用array方法將會拋出上述的兩種異常之一

注意 使用array方法返回的數組並不是緩沖區數據的副本 被返回的數組實際上就是緩沖區中的數據 也就是說 array方法只返回了緩沖區數據的引用 當數組中的數據被修改後 緩沖區中的數據也會被修改 返之也是如此 關於這方面內容將在下一節 讀寫緩沖區中的數據 中詳細講解

在上述的七個緩沖區類中 ByteBuffer類和CharBuffer類各自還有另外一種方法來創建緩沖區對象

ByteBuffer類

可以通過ByteBuffer類的allocateDirect方法來創建ByteBuffer對象 allocateDirect方法的定義如下

Direct(intcapacity)

使用allocateDirect方法可以一次性分配capacity大小的連續位元組空間 通過allocateDirect方法來創建具有連續空間的ByteBuffer對象雖然可以在一定程度上提高效率 但這種方式並不是平台獨立的 也就是說 在一些操作系統平台上使用allocateDirect方法來創建ByteBuffer對象會使效率大幅度提高 而在另一些操作系統平台上 性能會表現得非常差 而且allocateDirect方法需要較長的時間來分配內存空間 在釋放空間時也較慢 因此 在使用allocateDirect方法時應謹慎

通過isDirect方法可以判斷緩沖區對象(其他的緩沖區類也有isDirect方法 因為 ByteBuffer對象可以轉換成其他的緩沖區對象 這部分內容將在後面講解)是用哪種方式創建的 如果isDirect方法返回true 則這個緩沖區對象是用allocateDirect方法創建的 否則 就是用其他方法創建的緩沖區對象

CharBuffer類

我們可以發現 上述的七種緩沖區中並沒有字元串緩沖區 而字元串在程序中卻是最常用的一種數據類型 不過不要擔心 雖然java nio包中並未提供字元串緩沖區 但卻可以將字元串轉換成字元緩沖區(就是CharBuffer對象) 在CharBuffer類中的wrap方法除了上述的兩種重載形式外 又多了兩種重載形式 它們的定義如下

publicstaticCharBufferwrap(CharSequencecsq)publicstaticCharBufferwrap(CharSequencecsq intstart intend)

其中csq參數表示要轉換的字元串 但我們注意到csq的類型並不是String 而是CharSequence CharSequence類Java中四個可以表示字元串的類的父類 這四個類是String StringBuffer StringBuilder和CharBuffer(大家要注意 StringBuffer和本節講的緩沖區類一點關系都沒有 這個類在java lang包中) 也就是說 CharBuffer類的wrap方法可以將這四個類的對象轉換成CharBuffer對象

另外兩個參數start和end分別是子字元串的開始索引和結束索引的下一個位置 如將字元串 中的 轉換成CharBuffer對象的語句如下

CharBuffercb=CharBuffer wrap( );

下面的代碼演示了如何使用wrap方法將不同形式的字元串轉換成CharBuffer對象

lishixin/Article/program/Java/hx/201311/26505

Ⅱ Java網路編程從入門到精通(23):HTTP消息頭欄位

專題推薦 網路編程 基礎到進階教程

一 通用頭欄位

Connection

這個欄位只在HTTP 協議中存在 它決定了客戶端和伺服器進行了一次會話後 伺服器是否立即關閉網路連接 在客戶端最直接的表現是使用read方法(readLine方法也是一樣)讀完客戶端請求的Web資源後 是否立即返回 (readLine返回null) Connection有兩個值 Close和Keep Alive 當使用Connection Close時 和HTTP 協議是一樣的 當read方法讀完數據時立即返回 而使用Connection Keep Alive時 read方法在讀完數據後還要爛局被阻塞一段時間 直接讀取數據超時時間過後 還繼續往下執行 在上一篇文章中討論的readHttpResponse(……)方法實現的第 行可以驗證Connection的作用 下面讓我們來使用HTTP模擬器來做一個實驗

( )在HTTP模擬器中輸入如下的域名

( )HTTP模擬器中輸入如下的HTTP請求信息

GET/HTTP/ 孫喚Host:

( )按兩下回車(輸入一個空行)後 發送請求消息 並得到如圖 如示的HTTP響應消息頭

( )輸入y或Y後(在顯示響應頭後 要立刻輸入Y或y) 顯示響應消息的內容 在顯示完內容後 大約過了 秒鍾才進入 host port> 提示符(因為在sendHttpRequest()的實現代碼中的 行設置了讀取數據超時)

( )在 host port> 提示符下直接按回車 輸入最近一次使用的域名和 埠 再次輸入如下的HTTP請求

GET/HTTP/ Host: Connection:close

輸入完以上的HTTP請求後 重新執行第 步操作 最後在顯示HTTP響應消息內容後 直接直入了 host port> 提示符 除了這種方法 將請求的第一行改為GET / HTTP/ 這樣也可以無需等待直接結束

通過設置Connection 可以在下載Web資源(如多線程下載工具 Web瀏覽器等)後 立即斷開網路連接 這樣可以有效地降低客戶機的資源消耗

Date

這個Date頭欄位描述了請求消息和響應消息被創建的時間 這個欄位值是一個HTTP date類型 它的格式必須是GMT(格林尼治)時間 GMT時間是就是北京時間減 小時 下面是Date欄位的一個例子

Date:Tue Nov : : GMT

Content Length

指定消息實體的則歷凱位元組數 在請求消息中POST方法必須使用Content Length來指定請求消息的實體內容的位元組數 在響應消息中這個欄位值指定了當前HTTP響應所返回的Web資源的位元組數

二 HTTP請求消息頭欄位

Host

Host欄位用於指定客戶端所訪問的資源所在的主機名和埠號 如果埠號等於連接伺服器時所使用的埠號 則埠號可以省略 下面是一個使用Host欄位的一個例子

Host:

這個欄位是必須的 如果HTTP請求不包含這個欄位 伺服器將返回 (Bad Request)響應狀態

Accept

Accept欄位頭確定客戶端可以接收的媒體類型 一般的格式是 */* 或 類型/ 子類型 這個子段頭可以傳遞多個媒體類型 中間用 隔開 如下面是一個Accept的例子

Accept: image/gif image/jpg

如果請求頭使用上述的Accept欄位值 則伺服器端在動態生成網頁的IMG頭時將首先包含gif格式的圖像 如果gif圖象不存在 則包含jpg格式的圖象

User Agent

這個欄位頭用於指定客戶端是用什麼訪問的伺服器 如果是IE 瀏覽器 並且本機安裝了 net 則User Agent會有如下的值

User Agent:Mozilla/ (patible;MSIE ;WindowsNT ;SV ;Maxthon; NETCLR ; NETCLR ;InfoPath ;InfoPath )

伺服器可以通過這個欄位檢查客戶機的瀏覽器版本 並根據不同的版本來確定向客戶端發送的數據

Range

Range欄位頭通過伺服器只傳輸一部分Web資源 這個欄位頭可以用來實現斷點續傳功能 有很多下載工具就是通過這個欄位頭進行斷點續傳的 Range欄位可以通過三種格式設置要傳輸的位元組范圍

( )Range bytes=

傳輸范圍從 到 位元組

( )Range bytes=

傳輸Web資源中第 個位元組以後的所有內容

( )Range bytes=

傳輸最後 個位元組

三 HTTP響應消息頭欄位

Accept Ranges

這個欄位說明Web伺服器是否支持Range(是否支持斷點續傳功能) 如果支持 則返回Accept Ranges bytes 如果不支持 則返回Accept Ranges none

Content Range

指定了返回的Web資源的位元組范圍 這個欄位值的格式是

開始位元組位置—結束位元組位置/Web資源的總位元組數

下面是一個使用Content Range的例子

Content Range /

測試

在HTTP模擬器中連接伺服器 並輸入如下的HTTP請求消息

GET /nokiaguy/HttpSimulator rar HTTP/ Host: Range:bytes=

返回的響應消息頭如圖 所示

從上圖可以看出 伺服器支持斷點繼傳功能 而且還可以驗證Content Length的值是當前會話傳過來的位元組數 並不是Web資源的總的位元組數 而Content Range欄位值中 / 後面的數才是Web資源總的位元組數

Location

lishixin/Article/program/Java/hx/201311/27047

Ⅲ Java網路編程從入門到精通(4):DNS緩存

在通過DNS查找域名的過程中 可能會經過多台中間DNS伺服器才能找到指定的域名 因此 在DNS伺服器上查找域名是非常昂貴的操作 在Java中為了緩解這個問題 提供了DNS緩存 當InetAddress類第一次使用某個域名(如)創建InetAddress對象後 JVM就會將這個域名和它從DNS上獲得的信息(如IP地址)都保存在DNS緩存中 當下一次InetAddress類再使用這個域名時 就直接從DNS緩存里獲得所需的信息 而無需再訪問DNS伺服器

DNS緩存在默認時將永遠保留曾經訪問過的域名信息 但我們可以修改這個默認值 一般有兩種方法可以修改這個默認值

在程序中通過java security Security setProperty方法設置安全屬性nel的值(單位 秒) 如下面的代碼將緩存超時設為 秒

java security Security setProperty( nel );

設置java security文件中的neorkaddresl屬性 假設JDK的安裝目錄是C jdk 那麼java security文件位於c jdk jrelibsecurity目錄中 打開這個文件 找到nel屬性 並將這個屬性值設為相應的緩存超時(單位 秒)

如果將nel屬性值設為 那麼DNS緩存數據將永遠不會釋放 下面的代碼演示了使用和不使用DNS緩存所產生效果

package mynet;import *;publicclass MyDNS{publicstaticvoidmain(String[]args)throwsException{//args[ ]:本機名args[ ] 緩沖時間if(args length< )return;java security Security setProperty( nel args[ ]);longtime=System currentTimeMillis();InetAddressaddresses []=InetAddress getAllByName(args[ ]);System out println( addresses : +String valueOf(System currentTimeMillis() time)+ 毫秒 );for(InetAddressaddress:addresses )System out println(address);System out print( 按任意鍵繼續 );System in read();time=System currentTimeMillis();InetAddressaddresses []=InetAddress getAllByName(args[ ]);System out println( addresses : +String valueOf(System currentTimeMillis() time)+ 毫秒 );for(InetAddressaddress:addresses )System out println(address);}}

在上面的代碼中設置了DNS緩存超時(通過args[ ]參數) 用戶可以通過命令行參數將這個值傳入MyDNS中 這個程序首先使用getAllByName建立一個InetAddress數組 然後通過System in read使程序暫停 當用戶等待一段時間後 可以按任意鍵繼續 並使用同一個域名(args[ ])再建立一個InetAddress數組 如果用戶等待的這段時間比DNS緩存超時小 那麼無論情況如何變化 addresses 和addresses 數組中的元素是一樣的 並且創建addresses 數組所花費的時間一般為 毫秒(小於 毫秒後 Java無法獲得更精確的時間)

測試

執行如下命令(將DNS緩存超時設為 秒)

java mynet MyDNS

運行結果 (在 秒之內按任意鍵)

addresses : 毫秒/ 按任意鍵繼續addresses : 毫秒/

運行結果 (在 秒後按任意鍵)

addresses : 毫秒/ 按任意鍵繼續addresses : 毫秒/

在上面的測試中可能出現兩個運行結果 如果在出現 按任意鍵繼續… 後 在 秒之內按任意鍵繼續後 就會得到運行結果 從這個結果可以看出 addresses 所用的時間為 毫秒 也就是說 addresses 並未真正訪問DNS伺服器 而是直接從內存中的DNS緩存得到的數據 當在 秒後按任意鍵繼續後 就會得到運行結果 這時 內存中的DNS緩存中的數據已經釋放 所以addresses 還得再訪問DNS伺服器 因此 addresses 的時間是 毫秒(addresses 和addresses 後面的毫秒數可能在不同的環境下的值不一樣 但一般情況下 運行結果 的addresses 的值為 或是一個接近 的數 如 運行結果 的addresses 的值一般會和addresses 的值很接近 或是一個遠比 大的數 如 )

測試

執行如下命令(ComputerName為本機的計算機名 DNS緩存超時設為永不過期[ ])

java mynet MyDNS ComputerName

運行結果(按任意鍵繼續之前 將 刪除)

addresses : 毫秒myuniverse/ myuniverse/ 按任意鍵繼續addresses : 毫秒myuniverse/ myuniverse/

從上面的測試可以看出 將DNS緩存設為永不過期後 無論過多少時間 按任意鍵後 addresses 任然得到了兩個IP地址( 和 ) 而且addresses 的時間是 毫秒 但在這時 已經被刪除 因此可以判斷 addresses 是從DNS緩存中得到的數據 如果運行如下的命令 並在 秒後按任意鍵繼續後 addresses 就會只剩下一個IP地址( )

java mynet MyDNS ComputerName

如果域名在DNS伺服器上不存在 那麼客戶端在進行一段時間的嘗試後(平均為 秒) 就會拋出一個UnknownHostException異常 為了讓下一次訪問這個域名時不再等待 DNS緩存將這個錯誤信息也保存了起來 也就是說 只有第一次訪問錯誤域名時才進行 稱左右的嘗試 以後再訪問這個域名時將直接拋出UnknownHostException異常 而無需再等待 秒鍾

訪問域名失敗的原因可能是這個域名真的不存在 也可能是因為DNS伺服器或是其他的硬體或軟體的臨時故障 因此 一般不能將這個域名錯誤信息一直保留 在Java中可以通過neorkaddresl屬性設置保留這些信息的時間 這個屬性的默認值是 秒 它也可以通過java security Security setProperty方法或java security文件來設置 下面的代碼演示了neorkaddresl屬性的用法

package mynet;import *;publicclass MyDNS {publicstaticvoidmain(String[]args)throwsException{java security Security setProperty( neorkaddresl );longtime= ;try{time=System currentTimeMillis();InetAddress getByName( );}catch(Exceptione){System out println( 不存在!address : +String valueOf(System currentTimeMillis() time)+ 毫秒 );}//Thread sleep( );//延遲 秒try{time=System currentTimeMillis();InetAddress getByName( );}catch(Exceptione){System out println( 不存在!address : +String valueOf(System currentTimeMillis() time)+ 毫秒 );}}}

在上面的代碼中將neorkaddresl屬性值設為 秒 這個程序分別測試了address 和address 訪問(這是個不存在的域名 讀者可以將其換成任何不存在的域名)後 用了多長時間拋出UnknownHostException異常

運行結果

不存在!address : 毫秒不存在!address : 毫秒

我們從上面的運行結果可以看出 address 使用了 毫秒就拋出了異常 因此 可以斷定address 是從DNS緩存里獲得了域名不可訪問的信息 所以就直接拋出了UnknowHostException異常 如果將上面代碼中的延遲代碼的注釋去掉 那麼可能得到如下的運行結果

不存在!address : 毫秒不存在!address : 毫秒

從上面的運行結果可以看出 在第 秒時 DNS緩存中的數據已經被釋放 因此 address 仍需要訪問DNS伺服器才能知道是不可訪問的域名

在使用DNS緩存時有兩點需要注意

可以根據實際情況來設置nel屬性的值 一般將這個屬性的值設為 但如果訪問的是動態映射的域名(如使用動態域名服務將域名映射成ADSL的動態IP) 就可能產生IP地址變化後 客戶端得到的還是原來的IP地址的情況

lishixin/Article/program/Java/hx/201311/11147

Ⅳ Java入門如何學習怎麼學好Java開發

Java如今已經是全球編程語言排名第一的語源稿言,運用廣泛,前景廣闊,而且很多軟體的開發都離不開Java,而在以Java為核心的開發領域中,JavaEE程序員的需求量10年來一直居於首位!也正是因為如此很多的小夥伴參加Java培訓,當然也有部分小夥伴想要先了解一下,Java到底是什麼,怎麼可以學好,有個大概的認知才參加Java培訓或者Java學習,那麼Java入門如何學習?怎麼學好Java開發?學習要點是什麼?掌握以下內容讓Java入門更快,掌握Java更輕松。

一、Java入門如何學習?怎麼學好Java開發?Java必備基礎知識

1、你需要精通面向對象分析與設計(OOA/OOD)、涉及模式(GOF,J2EEDP)以及綜合模式。你應該十分了解UML,尤其是class,object,interaction以及statediagrams。

2、你需要學習JAVA語言的基礎知識以及局碰它的核心類庫(collections,serialization,streams,networking,multithreading,reflection以及其他)。

3、你應該了解JVM,classloaders,classreflect,以及垃圾回收的基本工作機制等。你應該有能力反編譯一個類文件並且明白一些基本的匯編指令。

4、你需要學習java資料庫技術,如JDBCAPI並且會使用至少一種persistence/ORM構架,例如Hibernate,JDO,CocoBase,TopLink,InsideLiberator或者iBatis。

5、你應該熟練掌握一種JAVAIDE例如sunOne,netBeans,IntelliJIDEA或者Eclipse。(有些人更喜歡VI或EMACS來編寫文件。隨便你用什麼了:)

6、JAVA(精確的說是有些配置)是冗長的,它需要很多的人工代碼(例如EJB),所以你需要熟悉代碼生成工具,例如XDoclet等等。

二、Java入門如何學習?怎麼學好Java開發?Java學習5大階段

階段1:Java設計和編程思想掌握的技能:

精通面向對象思想和Java基礎語法;熟練Java異常處理;精通JavaI/O操作;掌握Java多線程操作;精通Jjava集合類的使用;掌握Java網路編程;精通資料庫/JDBC的使用。

階段2:Web前端開發掌握的技能:

掌握html+css+js相關技術;通過H5相關的庫快速編寫代碼;搭桐裂談建符合大數據要求的界面,使前端+後端+大數據實現三維一體。

階段3:JavaEE進階掌握的技能:

掌握Tomcat/Nginx伺服器搭建;掌握Jsp&Servlet的使用;精通SSH、SSM兩大流行框架的原理及使用。

階段4:大數據核心知識掌握的技能:

了解hadoop機制原理;了解hadoop集群搭建過程;了解HdfsAPI使用以及mr編程模型;了解hive、hbase、sqoop、flume等組件的使用方法。

階段5:綜合項目掌握的技能:

大型網上商城項目、當日達項目、點餐系統、網上書城、OA辦公自動化項目、CRM客戶關系管理項目等企業真實綜合項目開發能力,達到中高級Java工程師的技術水平。

Java入門如何學習?怎麼學好Java開發?這是一個從易到難再到易的過程,需要一步一個腳印去學習,嚴格意義上說,java是一門較復雜的編程語言,不下苦功,是不可能學到非常好的層次。

同樣,學習java為了最快的提升效率和保證你能夠學會,還是需要找一家正規專業的培訓機構,接受系統化的學習和掌握java實戰項目,才能從入門到精通,更快成為一名合格的java工程師。

學Java當然要到17年技術積累的昌平北大青鳥教育,引領行業的技術,一線技術專家,15萬家就業合作企業。技術,求職,高薪,你的所有問題都能一站式解決!

2月份Java免費訓練營火熱報名中,經典Java免費課程限額送,一線技術大牛,為你解析行業前景,就業形勢,面試真經,讓你一站式成為Java大牛工程師,名額有限,填寫下面的表格即可獲得試聽資格!

Ⅳ 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

Ⅵ Java網路編程從入門到精通(5):使用InetAddress類的getHostName方法獲得域

該方法可以得到遠程主機的域名 也可以得到本機名 getHostName方法的定義如下

publicStringgetHostName()

下面是三種創建InetAddress對象的方式 在這三種方式中 getHostName返回的值是不同的

使用getLocalHost方法創建InetAddress對象

如果InetAddress對象是用getLocalHost方法創建的 getHostName返回的是本機名 如下面的代碼所示

InetAddressaddress=InetAddress getLocalHost();System out println(address getHostName());//輸出本機名

使用域名創建InetAddress對象

用域名作為getByName和getAllByName方法的參數調用這兩個方法後 系統會自動記住這個域名 當調用getHostName方法時 就無需再訪問DNS伺服器 而是直接將這個域名返回 如下面的代碼所示

InetAddressaddress=InetAddress getByName( );System out println(address getHostName());//無需訪問DNS伺服器 直接返回域名

使用IP地址創建InetAddress對象

使用IP地址創建InetAddress對象時(getByName getAllByName和getByAddress方法都可以通過IP地址創建InetAddress對象) 並不需要訪問DNS伺服器 因此 通過DNS伺服器查找域名的工作就由getHostName方法來完成 如果這個IP地址不存在或DNS伺服器不允許進行IP地址和域名的映射 getHostName方法就直接返回這個IP地址 如下面的代碼所示

InetAddressaddress=InetAddress getByName( );System out println(address getHostName());//需要訪問DNS伺服器才能得到域名InetAddressaddress=InetAddress getByName( );//IP地址不存在System out println(address getHostName());//直接返回IP地址

從上面的三種情況可以看出 只有通過使用IP地址創建的InetAddress對象調用getHostName方法時才訪問DNS伺服器 在其他情況 getHostName方法並不會訪問DNS伺服器 而是直接將域名或本機名返回 下面的代碼演示了在不同情況下如何使用getHostName方法 並計算了各種情況所需的毫秒數

package mynet;import *;publicclass DomainName{publicstaticvoidmain(String[]args)throwsException{longtime= ;//得到本機名InetAddressaddress =InetAddress getLocalHost();System out println( 本機名 +address getHostName());//直接返回域名InetAddressaddress =InetAddress getByName( );time=System currentTimeMillis();System out print( 直接得到域名 +address getHostName());System out println( 所用時間 +String valueOf(System currentTimeMillis() time)+ 毫秒 );//通過DNS查找域名InetAddressaddress =InetAddress getByName( ); System out println( address : +address );//域名為空time=System currentTimeMillis();System out print( 通過DNS查找域名 +address getHostName());System out println( 所用時間 +String valueOf(System currentTimeMillis() time)+ 毫秒 ); System out println( address : +address );//同時輸出域名和IP地址}}

運行結果

本機名 ComputerName直接得到域名 所用時間 毫秒address :/ 通過DNS查找域名 bigip o所用時間 毫秒address :bigip o/

lishixin/Article/program/Java/hx/201311/26413

Ⅶ Java入門如何學習怎麼學好Java開發

Java如今已經是全球編程語言排名第一的語言,運用廣泛,前景廣闊,而且很多軟體的開發都離不開Java,而在以Java為核心的開發領域中,JavaEE程序員的需求量10年來一直居於首位!也正是因為如此很多的小夥伴參加Java培訓,當然也有部分小夥伴想要先了解一下,Java到底是什麼,怎麼可以學好,有個大概的認知才參加Java培訓或者Java學習,那麼Java入門如何學習?怎麼學好Java開發?學習要點是什麼?掌握以下內容讓Java入門更快,掌握Java更輕松。

一、Java入門如何學習?怎麼學好Java開發?Java必備基礎知識

1、你需要精通面向對象分析與設計(OOA/OOD)、涉及模式(GOF,J2EEDP)以及綜合模式。你應該十分了解UML,尤其是class,object,interaction以及statediagrams。

2、你需要學習JAVA語言的基礎知識以及它的核心類庫(collections,serialization,streams,networking,multithreading,reflection以及其他)。

3、你應該了解JVM,classloaders,classreflect,以及垃圾回收的基本工作機制等。你應該有能力反編譯一個類文件並且明白一些基本的匯編指令。

4、你需要學習java資料庫技術,如JDBCAPI並且會使用至少一種persistence/ORM構架,例如Hibernate,JDO,CocoBase,TopLink,InsideLiberator或者iBatis。

5、你應該熟練掌握一種JAVAIDE例如sunOne,netBeans,IntelliJIDEA或者Eclipse。(有些人更喜歡VI或EMACS來編寫文件。隨便你用什麼了:)

6、JAVA(精確的說是有些配置)是冗長的,它需要很多的人工代碼(例如EJB),所以你需要熟悉代碼生成工具,例如XDoclet等等。

二、Java入門如何學習?怎麼學好Java開發?Java學習5大階段

階段1:Java設計和編程思想掌握的技能:

精通面向對象思想和Java基礎語法;熟練Java異常處理;精通JavaI/O操作;掌握Java多線程操作;精通Jjava集合類的使用;掌握Java網路編程;精通資料庫/JDBC的使用。

階段2:Web前端開發掌握的技能:

掌握html+css+js相關技術;通過H5相關的庫快速編寫代碼;搭建符合大數據要求的界面,使前端+後端+大數據實現三維一體。

階段3:JavaEE進階掌握的技能:

掌握Tomcat/Nginx伺服器搭建;掌握Jsp&Servlet的使用;精通SSH、SSM兩大流行框架的原理及使用。

階段4:大數據核心知識掌握的技能:

了解hadoop機制原理;了解hadoop集群搭建過程;了解HdfsAPI使用以及mr編程模型;了解hive、hbase、sqoop、flume等組件的使用方法。

階段5:綜合項目掌握的技能:

大型網上商城項目、當日達項目、點餐系統、網上書城、OA辦公自動化項目、CRM客戶關系管理項目等企業真實綜合項目開發能力,達到中高級Java工程師的技術水平。

Java入門如何學習?怎麼學好Java開發?這是一個從易到難再到易的過程,需要一步一個腳印去學習,嚴格意義上說,java是一門較復雜的編程語言,不下苦功,是不可能學到非常好的層次。

同樣,學習java為了最快的提升效率和保證你能夠學會,還是需要找一家正規專業的培訓機構,接受系統化的學習和掌握java實戰項目,才能從入門到精通,更快成為一名合格的java工程師。

學Java當然要到17年技術積累的昆明北大青鳥教育,引領行業的技術,一線技術專家,15萬家就業合作企業。技術,求職,高薪,你的所有問題都能一站式解決!

2月份Java免費訓練營火熱報名中,經典Java免費課程限額送,一線技術大牛,為你解析行業前景,就業形勢,面試真經,讓你一站式成為Java大牛工程師,名額有限,填寫下面的表格即可獲得試聽資格!

Ⅷ Java網路編程從入門到精通(15):為什麼要使用SocketAddress來管理網路地址

在使用Socket來連接伺服器時最簡單的方式就是直接使用IP和埠 但Socket類中的connect方法並未提供這種方式 而是使用SocketAddress類來向connect方法傳遞伺服器的IP和埠 雖然這種方式從表面上看要麻煩一些 但它會給我們帶來另外一個好處 那就是網路地址的重用

所謂網路地址的重用表現在兩個方面

通過建立一個SocketAddress對象 可以在多次連接同一個伺服器時使用這個SocketAddress對象

在Socket類中提供了兩個方法 getRemoteSocketAddress和getLocalSocketAddress 通過這兩個方法可以得到伺服器和本機的網路地址 而且所得到的網路地址在相應的Socket對象關閉後任然可以使用 下面是這兩個方法的聲明

()()

不管在使用Socket類連接伺服器時是直接使用IP和埠 還是使用SocketAddress 這兩個方法都返回SocketAddress形式的網路地址 當Socket對象未連接時這兩個方法返回null 但要注意的是只有在Socket對象未連接時這兩個方法才返回null 而當已經連接成功的Socket對象關閉後仍可使用這兩個方法得到相應的網路地址

雖然上面曾多次提到SocketAddress 但SocketAddress只是個抽象類 它除了有一個默認的構哪肆肢造方法外 其它的方法都是abstract的 因此 我們必須使用SocketAddress的子類來建立SocketAddress對象 在JDK 中J只為我們提供了IP網路地址的實現類 InetSocketAddress 這個類是從SocketAddress繼承的 我們可以通過雹虛如下的方法來建立SocketAddress對象

SocketAddresssocketAddress=newInetSocketAddress(host ip);

下面的代碼演示了如何通過SocketAddress來共享網路地址

package mynet;import *;publicclass MySocketAddress{publicstaticvoidmain(String[]args){try{Socketsocket =newSocket( );SocketAddresssocketAddress=socket getRemoteSocketAddress();socket close();李世Socketsocket =newSocket();//socket bind(newInetSocketAddress( ));nnect(socketAddress);socket close(); =(InetSocketAddress)socketAddress;System out println( 伺服器域名: +inetSocketAddress getAddress() getHostName());System out println( 伺服器IP: +inetSocketAddress getAddress() getHostAddress());System out println( 伺服器埠: +inetSocketAddress getPort()); =(InetSocketAddress)socket getLocalSocketAddress();System out println( 本地IP: +inetSocketAddress getAddress() getLocalHost() getHostAddress());System out println( 本地埠: +inetSocketAddress getPort());}catch(Exceptione){System out println(e getMessage());}}}

輸出結果

伺服器域名

伺服器IP

伺服器埠

本地IP

本地埠

lishixin/Article/program/Java/hx/201311/26231

Ⅸ 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編程需要知道的十二個步驟!


一、學習前的准備工作

java語言一般用於大型的伺服器程序開發,所有有必要了解如下內容:Unix開發環境Unix系統原理、Unix開發環境、Unix常用命令。熟練掌握Unix常用命令;熟練構建下的Java開發環境。

二、Java語言基礎的學習階段學習

任何一門語言都要打好基礎,曾經學過高級程序語言(C,C++等)來說,java語言基礎有自己的特點,但是基本規律都是相通的,如:演算法基礎、常用數據結構、企業編程規范。掌握常見的數據結構和實用演算法;培養良好的企業級編程習慣。

三、面向對象語言的共性

Java面向對象面向對象特性:封裝、繼承、多態等。掌握面向對象的基本原則以及在編程實踐中的意義;掌握Java面向對象編程基本實現原理。

四、JDK核心API語言核心包、異常處理、常用工具包、集合框架

熟練掌握JDK核心API編程技術;理解正滑悔API設計原則;具備熟練的閱讀API文檔的能力;JavaSE核心異常處理、多線程基礎、IO系統、網路編程、Swing組件、JVM性能調優(JVM內存結構剖析、GC分析及調優、JVM內存參數優化)、Java泛型、JDK新特性。熟練掌握JavaSE核心內容,特別是IO和多線程;初步具備面向對象設計和編程的能力;掌握基本的JVM優化策略。XMLXML語法、XML解析(SAX、DOM)、Dom4j組件、Digester組件。熟練掌握XML語法規則;理解DOM模型;熟悉Java對XML的各種解析方式。

五舉正、SQL語言SQL語句基礎和提高、SQL語句調優

熟練的掌握SQL語句;掌握一定的資料庫查詢技巧及SQL語句優化技巧。Oracle資料庫開發Oracle體系結構及系統管理、Oracle資料庫高級編程、資料庫設計基礎。掌握Oracle體系結構及核心編程技術。

六、連接資料庫:JDBCJDBC核心API(Connection、Statement、ResultSet)、JDBC優化技術(緩存技術、批處理技術、連接池技術)

理解JDBC作為規范的設計原則;熟練掌握JDBCAPI;具備使用JDBC對資料庫進行高效訪問的能力。

七、軟體工程基礎軟體過程和軟體活動

需求設計、概要設計、詳細設計基本原則和文檔規范;配置管理的基本概念和必要性;CVS基本操作;Ant簡介理解軟體過程的普遍概念和基本的軟體活動;理解迭代的意義;掌握Ant、CVS等常用配置管理及部署工具。

八、OOAD及設計模式面向對象基本設計原則、工廠模式、策略模式、適配器模式、代理模式等、門面模式

理解面向對象設計的一般原則;理解重用的意義;掌握常見的設計模式。

九、讓悶HTML/CSSHTML基本文檔結構、掌握CSS基礎語法、關於HTML文檔塊、鏈接、列表、表格、表單等

掌握

十、Ajax基礎、XHR對象、Ajax設計模式、JSON技術

掌握Ajax的基本通信原理;掌握基於XML和JSON的Ajax數據規則。

十一、JavaScript框架JQuery、JQuery插件、DWR

掌握JQuery核心API;了解JQuery基本設計原則;了解多種JQuery插件;掌握DWR的基本原理及應用技巧。

十二、ssh三大框架的學習

這是企業實際應用的框架模型:

1,Struts2.1.6Struts2核心控制流程、Ognl、Action、Interceptor、,Result、FreeMarker、Struts2標記庫、Struts2擴展、Struts2應用技巧(輸入驗證、消息國際化、文件上傳和下載、防止重復提交等)。熟練掌握Struts2核心要件,特別是Interceptor和Result;掌握基於模板技術的Struts2UI組件;掌握基於Ognl的數據共享方式、掌握Struts2各種定製及擴展方式;熟練掌握基於Struts2的Web開發技巧。

2,Hibernate3.2.1ORM概念、Hibernate核心API、Hibernate實體映射技術、Hibernate關系映射技巧、HQL查詢、OSCache及Hibernate緩存技術。重點掌握Hibernate多種關聯映射技巧及其實用背景,做到在合適的時候使用合適的關聯方式;掌握多種Hibernate查詢技巧及優化技術。

3,Spring2.5SpringIoc基礎、Ioc注入技巧、對象高級裝配(自動裝配、模板裝配、組件掃描特性、FactoryBean、對象生命周期)、SpringAOP原理、AspectJ、SpringJDBC支持、Spring事務及安全管理;Spring整合Hibernate、Spring整合Struts、SpringMVC簡介。深入理解Ioc和AOP的基本原理和實現方式;熟練掌握SpringIoc及AOP實現方式;熟練掌握Spring事務管理;熟練掌握Spring與其他組件的整合技術。




閱讀全文

與java網路編程從入門到精通相關的資料

熱點內容
博科清空命令 瀏覽:384
簡愛英文pdf 瀏覽:376
cnc編程有前途嗎 瀏覽:586
聯想app怎麼聯網 瀏覽:722
linuxftp命令登錄 瀏覽:1000
android獲取圖片縮略圖 瀏覽:646
神戶制鋼螺桿壓縮機 瀏覽:29
差分演化演算法 瀏覽:567
中山市加密軟體 瀏覽:446
mc反編譯源碼 瀏覽:139
企業商城網站源碼 瀏覽:411
shell腳本編程是什麼 瀏覽:762
單片機led閃爍匯編 瀏覽:203
點淘app怎麼沒金蛋了 瀏覽:878
app拉新哪裡找推廣碼 瀏覽:935
哪個app生活服務好 瀏覽:108
mht安卓用什麼軟體打開 瀏覽:320
html5即時通訊源碼 瀏覽:144
python編程基礎豆瓣 瀏覽:710
程序員亂碼是什麼意思 瀏覽:373