版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、Netty3.2 快速有效的網(wǎng)絡(luò)應(yīng)用開3.2.4.Final 譯者LarryZhang 二次整理1. 問題提2. 解決方1. 開1.1Netty3.2 快速有效的網(wǎng)絡(luò)應(yīng)用開3.2.4.Final 譯者LarryZhang 二次整理1. 問題提2. 解決方1. 開1.1. 寫在開始之. 1.3. Received. . . 1.7處理基于流的傳 1.7.1套接字緩存(SocketBuffer)的一個(gè)小警 1.7.2. 第一個(gè)解決辦 1.7.3. 第二個(gè)解決辦 1.8. POJO1.9. 關(guān)閉應(yīng)用程 1.10. 2. 架構(gòu)概2.1豐富的緩存數(shù)據(jù)結(jié)I/O2.3. 基 2.4. 2.4.1. 編碼框2
2、.4.2SSLTLS 支2.4.3HTTP實(shí)ProtocolBuffer集2.5. 總前1問題提常常使用2.4. 2.4.1. 編碼框2.4.2SSLTLS 支2.4.3HTTP實(shí)ProtocolBuffer集2.5. 總前1問題提常常使用HTTP客戶從WEB服務(wù)器上獲不適用通用的 的 多2解決方 高 Chapter1開1.1. 開始之. 1.3. Received. . . 1.7處理基于流的傳 1.7.1套接字緩存(SocketBuffer)的一個(gè)小警 1.7.2. 1.7.3. 1.8. POJO1.9關(guān)閉你的應(yīng)用程 1.10. 這一章圍繞Neey Chapter 2,架構(gòu)概覽開始,然后
3、再回到這里1.1. 開始之此。 API頁面上。此外,記Netty并告1.2. 編寫一個(gè) Discard服個(gè) , , 個(gè) 當(dāng)一個(gè)異常因?yàn)镮/O 錯(cuò)誤由Netty 拋出,或者由在處理事件過程中,handler 的實(shí)現(xiàn)拋出了異常 ,并且對應(yīng)channel應(yīng)已經(jīng)實(shí)現(xiàn)了 DISCARD 服務(wù)的一半。接下來需要寫 main 方法來運(yùn)行這個(gè)配備到此為import .InetSocketAddress; importjava.util.concurrent.Executors;publicclassDiscardServerpublicicvoidmain(Stringargs)throwsException
4、 new( Executors.newCachedThre 使用 建 和 ServerBootstrapbootstrap=newServerBootstrap bootstrap.setPipelineFactory(new publicChannelPipelinegetPipeline() bootstrap.setOption(child.keepAlive, true); 的 的 剛 問題是 著 buf = (ChannelBuffer) e.getMessage(); uf.readable() ln(char)buf.readByte(); 多個(gè) 。多個(gè) 。 le.discard
5、 包1.4. 編寫一個(gè) Echo服這。這里返回的Channel 代表收到消息事MessageEvent 的那個(gè)連接 1.5. 編寫一個(gè) Time服 ch = e.getChannel(); messageReceived 方法,而是需要重channelConnected 方法。代碼如下 eEvente) Channelch=(System.currentTimeMillis() / 1000);ChannelFuturef= public 釋過, 釋過, 用 尚未發(fā)生的后續(xù)I/O操作ChannelFuture 為 importChannelBuffer dynamicBuf= 也返回 的 完成
6、后關(guān)Channel 1.6. Time客戶需要一TIME 的 import .InetSocketAddress; importjava.util.concurrent.Executors;publicclassTimeC ntChannelch= NioServerSocketChannelFactoryC ntBootstrap 在客戶端,對應(yīng)服務(wù)器端的ServerBootstrap publicicvoidmain(Stringargs)throwsString host=port new( Executors.newCachedThrentBootstrapbootstrap=newn
7、tBootstrap bootstrap.setPipelineFactory(new publicChannelPipelinegetPipeline()returnChannels.pipeline(newTimeC bootstrap.setOption(keepAlive, true);(new InetSocketAddress(host, 應(yīng)該connect方法而不是bind 方法應(yīng)該connect方法而不是bind 方法 收 看上去真的很簡單,并且和服務(wù)器端代碼沒什么區(qū)別。不過,這個(gè) IndexOutOfBoundsExceptionimport publicclassTimeC
8、 long currentTimeMillis = buf.read() * 1000L;ln(newDate(currentTimeMillis); e.getCause().pr1.7. 處理基于流的傳1.7.1. 1.7. 處理基于流的傳1.7.1. 1.7.2. 現(xiàn)在TIME例子個(gè) |ABC|DEF|GHI|AB |CDEFG|H|I|ABC|DEF|GHITimeC importimport publicclassTimeC privatefinalChannelBufferbuf= ifytes()=4)long currentTimeMillis = buf.read() * 1
9、000L; ln(newDate(currentTimeMillis); 這個(gè)動態(tài)的緩存是能夠根據(jù)需要增加容量ChannelBuffer 。這這個(gè)動態(tài)的緩存是能夠根據(jù)需要增加容量ChannelBuffer 。這首先,所有收到的數(shù)據(jù)都必須匯聚到buf中 1.7.3. 你可能也注意到,你可以增加多個(gè) ChannelHandler 給 ChannelPipeline,由此,你可以拆分單ChannelHandler 為多個(gè)模塊化的 handler 來減少你的應(yīng)用程序的復(fù)雜度。 例如, 你可以拆分TimeC TimeDecoder 處理字節(jié)重最初那個(gè)簡單的TimeC publicclassTimeDec
10、oderextendsprotectedObject FrameDecoder ChannelHandler 的一個(gè)實(shí)現(xiàn),使得處理重組問題簡單FrameDecoder調(diào)用decode方法,收到新的數(shù)據(jù)時(shí)FrameDecoder ChannelHandler 的一個(gè)實(shí)現(xiàn),使得處理重組問題簡單FrameDecoder調(diào)用decode方法,收到新的數(shù)據(jù)時(shí)如果返回的是null 以為這收到的數(shù)據(jù)還FrameDecoder 會在數(shù)據(jù)量足夠的時(shí)候再次調(diào)用 了一個(gè)消息。FrameDecoder 會丟棄位于 直至返null已經(jīng)有了另一個(gè) handler 可以現(xiàn)在到 ChannelPipeline應(yīng)該修TimeC
11、 nt ChannelPipelineFactory 實(shí)現(xiàn) API手冊以獲bootstrap.setPipelineFactory(new publicChannelPipelinegetPipeline() newTimeC ifytes()returnreturn此外,Netty 提供了一些“開箱即用”此外,Netty 提供了一些“開箱即用” net針對的是基于行的文本協(xié)1.8. POJO 、可復(fù)用。在這個(gè)ITME客戶端、服務(wù)器端的例子中只 protectedObjecte)returnprotectedObject if (buffer.readabytes()4) return nul
12、l;import publicprivatepublic this.value=returnpublicStringtoString()returnnewDate(value* 的方法后,TimeC 是不是看上去更簡單、 更優(yōu)雅了? 同樣的技術(shù)可以用于服務(wù)器端這次先更新一 下現(xiàn)在唯一缺少的就是編了。 這個(gè)編應(yīng)該是一個(gè)把 ChannelBuffer 轉(zhuǎn)換為 UnixTime UnixTimetime=newUnixTime(System.currentTimeMillis()/ChannelFuturef=e.getChannel().write(time); UnixTimem=(UnixTi
13、me)e.getMessage(); System.out.pr ln(m); returnnew編一個(gè)寫入的請求。請注意MessageEvent 參數(shù)編一個(gè)寫入的請求。請注意MessageEvent 參數(shù)和messageReceived的是同一類型,但是卻有不同的解讀。一個(gè)ChannelEvent 可以是上行或下行件,這取決于事件的傳遞方向。比如,MessageEvent在messageReceived中是上行事件,但是區(qū) 新的 中的前一個(gè) 用 importimport publicvoidwriteRequested(ChannelHandlerContextctx,UnixTimetim
14、e=(UnixTime) 的 1.9. 關(guān)閉應(yīng)用的 1.9. 關(guān)閉應(yīng)用程 字 如果在 TimeC nt 應(yīng)用這三步, 關(guān)閉唯一的客戶端連接所有 ChannelFactory 持有的資 publicclassTimeC ntpublicicvoidmain(Stringargs)throwsException ChannelPipelin peline=write(ctx, e.getFuture(), buf); 。 ChannelFuture 的getCause() 待 的 需要一所有活動連接的數(shù)據(jù)結(jié)構(gòu),這可不是瑣碎的小事兒一樁。還好,有一個(gè)辦法,那就ChannelGroupChannelF
15、uturefuture=bootstrap.connect(.); ifs()future.getCause().pr ChannelGroup代表打開Channel的集合JavacollectionAPI的特殊擴(kuò)展。如果一個(gè)ChannelGroup代表打開Channel的集合JavacollectionAPI的特殊擴(kuò)展。如果一個(gè)Channel入了 ChannelGroup, 然后這個(gè) Channel 被關(guān)閉了, 那么這個(gè)關(guān)閉的 Channel 會自動從它的ChannelGroup 中移除。你可以對一個(gè)組執(zhí)行一個(gè)操作,卻作用于所有屬于同一個(gè)組的Channel。比如你可以在停止服務(wù)器的時(shí)候,關(guān)閉
16、一ChannelGroup內(nèi)所有的ChannelTimeServerHandler ChannelGroup( TimeServer.allChannels)添加一個(gè)新的ChannelGroup 是線程安全的這下所有的啟用Channel都自動publicclassTimeServer publicicvoidmain(Stringargs)throwsException Channelchannel=bootstrap.bind(.); ServerBootstrap的bind 方法返回了一個(gè)服 ServerBootstrap的bind 方法返回了一個(gè)服務(wù)器端的、綁定了指定本地地址的Chann
17、el。調(diào)返回的Channelclose()方法可以使得它和綁定的本地地址解除綁定 的 包括綁定的服務(wù)Channel 會解除綁定,所有的受理的連接會被異步地關(guān)閉得到所有連 1.10. 總 區(qū) 一直都在期待Chapter2架構(gòu)概. I/O2.3. 基2.4. 為更快捷開發(fā)的高級組2.4.1. 編碼框2.4.2SSLTLS 支2.4.3HTTP 實(shí)ProtocolBuffer集2.5. 總2.4.2SSLTLS 支2.4.3HTTP 實(shí)ProtocolBuffer集2.5. 總。2.1. 豐富的 Buffer數(shù)據(jù)結(jié) 如果必要,你可以定義你buffer 再也不需flip() 了 ByteBuffer速
18、度ty.buffer 包描述I/OJava 中傳統(tǒng)的 I/O API為不同的傳輸類型提供了不同的類型和方法。例如, .Socket ty.buffer 包描述I/OJava 中傳統(tǒng)的 I/O API為不同的傳輸類型提供了不同的類型和方法。例如, .Socket 候就確定你的而應(yīng)用程序基于哪套API 的API提供了很多重要的傳輸方式 另一種 替換掉幾行構(gòu)造方法的代碼。此外2.3基者鏈模式的事件模2.3基者鏈模式的事件模 針對 ChannelEventChannelPipeline中的ChannelHandler來處理。pipeline實(shí)現(xiàn)了一 ercepting Filter模式的高級形式,使得用戶可以完全控制事件是如何被處理的、handler之間如 public class MyWriteHandler implements SimpleChannelHandler Objectmessage=/Dosomethingwit
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 【Ks5u名?!亢邶埥∧涌h高級中學(xué)2020屆高三第五次模擬語文試題-掃描版含答案
- 【原創(chuàng)】江蘇省宿遷市2013-2020學(xué)年高一物理(人教版)暑期作業(yè)
- 2022成都市高考英語單項(xiàng)選擇及閱理自練附答案1
- 五年級數(shù)學(xué)(小數(shù)除法)計(jì)算題專項(xiàng)練習(xí)及答案匯編
- 一年級數(shù)學(xué)計(jì)算題專項(xiàng)練習(xí)集錦
- 四年級數(shù)學(xué)(三位數(shù)乘兩位數(shù))計(jì)算題專項(xiàng)練習(xí)及答案
- 【同步輔導(dǎo)】2021高中數(shù)學(xué)北師大版選修2-3學(xué)案:《排列》
- 【全程復(fù)習(xí)方略】2020年高考政治一輪課時(shí)提升作業(yè)-必修2-第5課(廣東專供)
- 山東省棗莊十五中西校區(qū)2022-2023學(xué)年七年級上學(xué)期期末語文試卷
- 八年級英語下冊Module1FeelingsandimpressionsUnit1Itsmellsdelicious第2課時(shí)課件
- 2025年云南昆明經(jīng)濟(jì)技術(shù)開發(fā)區(qū)投資開發(fā)(集團(tuán))有限公司招聘筆試參考題庫附帶答案詳解
- HSE基礎(chǔ)知識培訓(xùn)
- 社會單位消防安全知識考試題庫(濃縮500題)
- 2023-2024學(xué)年廣東省廣州市花都區(qū)九年級(上)期末物理試卷(含答案)
- 安徽省蚌埠市2023-2024學(xué)年高一上學(xué)期期末考試 地理 含答案
- 2024年度托管班二人合伙協(xié)議書3篇
- 山東中醫(yī)藥大學(xué)中西醫(yī)臨床(專升本)學(xué)士學(xué)位考試復(fù)習(xí)題
- 保定學(xué)院《大學(xué)英語》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024-2025學(xué)年九年級語文上冊部編版期末綜合模擬試卷(含答案)
- 鄉(xiāng)村振興暨干部素質(zhì)提升培訓(xùn)班學(xué)習(xí)心得體會
- IATF16949:2024標(biāo)準(zhǔn)質(zhì)量手冊
評論
0/150
提交評論