Android開發(fā)之使用Netty進(jìn)行Socket編程(一)

一些基本概念

1 Socket

1) 同一個名詞Socket有多種不同意思。
2) 在計算機(jī)網(wǎng)絡(luò)知識體系中,運輸層的TCP(傳輸控制協(xié)議)把連接作為最基本的抽象腥光。TCP的連接有兩個端點懒构,被稱為Socket众羡,通過IP地址+端口號來區(qū)分來自不同應(yīng)用程序進(jìn)程或網(wǎng)絡(luò)連接的通信勋颖,實現(xiàn)數(shù)據(jù)傳輸?shù)牟l(fā)服務(wù)嗦嗡。Client進(jìn)程和Server進(jìn)程之間是通過Socket讀寫數(shù)據(jù)進(jìn)行通信的。
3) JDK的java.net包下有兩個類:SocketServerSocket饭玲,在Client和Server建立連接成功后侥祭,兩端都會產(chǎn)生一個Socket實例,操作這個實例茄厘,完成所需的會話矮冬,而程序員就通過這些API進(jìn)行網(wǎng)絡(luò)編程。 Socket連接過程分為三個步驟:服務(wù)器監(jiān)聽次哈,客戶端請求胎署,連接確認(rèn)。需要注意的是窑滞,Socket自己并不是一種協(xié)議琼牧,而是對TCP/IP協(xié)議的抽象,并提供最基本的函數(shù)接口方便開發(fā)者調(diào)用哀卫。

2 Netty

Netty.io官網(wǎng)介紹:
Netty是一個異步非阻塞的事件驅(qū)動型的網(wǎng)絡(luò)應(yīng)用程序框架巨坊。滿足高性能協(xié)議服務(wù)器和客戶端的快速發(fā)展需求。
Netty是一個高性能此改、方便開發(fā)的NIO框架趾撵,使用它可以簡單快速地開發(fā)網(wǎng)絡(luò)應(yīng)用程序,比如客戶端和服務(wù)端的協(xié)議带斑。Netty大大簡化了網(wǎng)絡(luò)編程比如TCP和UDP的 Socket的開發(fā)鼓寺。
“快速和簡單”并不意味著應(yīng)用程序會有難維護(hù)和性能低的問題,Netty是一個精心設(shè)計的框架勋磕,它從FTP妈候、SMTP、HTTP挂滓、許多二進(jìn)制和基于文本的傳統(tǒng)協(xié)議實現(xiàn)中吸收了經(jīng)驗苦银,為我們提供了一個高開發(fā)效率、高性能赶站、穩(wěn)定幔虏、可伸縮的解決方案。

3 NIO

剛剛提到:

Netty是一個NIO框架贝椿。

理解NIO框架的基本概念有助于學(xué)習(xí)Netty提供給開發(fā)者使用的API想括。
NIO 是jdk1.4 里提供的新API,全稱即java new I/O烙博。Sun 官方標(biāo)榜的特性如下: 為所有的原始類型提供緩存(Buffer)支持瑟蜈。
首先我們來回憶一下Java的IO

  1. IO可以簡單理解為 數(shù)據(jù)流方向:程序→硬盤寫數(shù)據(jù)(Output)以及 硬盤→程序讀數(shù)據(jù)(Input)烟逊,同時Java IO是基于流(Stream)的,所有的API都繼承自InputStream/OutputStream铺根。意味著每次從流中讀一個或多個字節(jié)宪躯,直至讀取所有字節(jié),它們沒有被緩存在任何地方位迂。
  2. IO的過程是阻塞的访雪,也就是說當(dāng)一個線程調(diào)用read() 或 write()時,該線程被阻塞掂林,直到有一些數(shù)據(jù)被讀取臣缀,或數(shù)據(jù)完全寫入。該線程在此期間不能再干任何事情了党饮。

然后我們再來看NIO:
NIO包括三個核心:

  • Channels
    FileChannel肝陪、DatagramChannel、SocketChannel刑顺、ServerSocketChannel這些通道涵蓋了UDP 和 TCP 網(wǎng)絡(luò)IO氯窍,以及文件IO。
    Java NIO的通道類似流蹲堂,但又有些不同:
    1)流只是在一個方向上移動(一個流必須是 InputStream 或者 OutputStream 的子類)狼讨,而通道可以用于讀、寫或者同時用于讀寫柒竞,是全雙工的政供。
    2)通道可以異步地讀寫。
    3)通道中的數(shù)據(jù)總是要先讀到一個Buffer朽基,或者總是要從一個Buffer中寫入布隔。
    Channel

    實際上Channel可以分為兩大類,分別是用于網(wǎng)絡(luò)讀寫的SelectableChannel和用于文件操作的FileChannel稼虎。
    Netty中ServerSocketChannel和SocketChannel都是SelectableChannel的子類 衅檀。
  • Buffers
    所有數(shù)據(jù)都是用緩沖區(qū)進(jìn)行處理的。在讀取數(shù)據(jù)時霎俩,它是直接讀到緩沖區(qū)中哀军;在寫入數(shù)據(jù)時,它也是寫入到緩沖區(qū)中打却。任何時候訪問 NIO 中的數(shù)據(jù)杉适,我們都是通過緩沖區(qū)進(jìn)行讀寫操作。
    緩沖區(qū)本質(zhì)上是一塊可以寫入數(shù)據(jù)柳击,然后可以從中讀取數(shù)據(jù)的內(nèi)存猿推。這塊內(nèi)存被包裝成NIO Buffer對象,并提供了一組方法捌肴,用來方便的訪問該塊內(nèi)存蹬叭。
    NIO中Buffer的實現(xiàn)包括ByteBuffer毯侦、CharBuffer、DoubleBuffer等等具垫,這些Buffer覆蓋了你能通過IO發(fā)送的基本數(shù)據(jù)類型:byte, short, int, long, float, double 和 char。
Buffer
  • Selectors
    Selector(選擇器)是Java NIO中能夠檢測一到多個NIO通道试幽,并能夠知曉通道是否為諸如讀寫事件做好準(zhǔn)備的組件筝蚕。
    Selector允許單線程處理多個 Channel。如果你的應(yīng)用打開了多個連接(通道)铺坞,但每個連接的流量都很低起宽,使用Selector就會很方便。例如济榨,在一個聊天服務(wù)器中坯沪。
    Selector

    Selector會不斷的輪詢注冊在其上的Channel,如果某個Channel上面有新的TCP連接接入擒滑、讀和寫事件腐晾,這個Channel就處于就緒狀態(tài),會被Selector輪詢出來丐一,然后通過SelectionKey可以獲取就緒Channel的集合進(jìn)行后續(xù)的IO操作藻糖。

所以,與IO相比库车,

  1. NIO是從緩沖區(qū)(Buffer)讀寫數(shù)據(jù)的巨柒,而不是面向流(Stream)。例如在讀取硬盤數(shù)據(jù)時柠衍,并不是僅從一個InputStream上逐字節(jié)讀取洋满,而是數(shù)據(jù)必須先讀入緩沖區(qū)再處理。
  2. NIO在一個線程從某通道發(fā)送請求讀取數(shù)據(jù)珍坊,并不會保持線程阻塞牺勾,所以直至數(shù)據(jù)變的可以讀取之前,該線程可以繼續(xù)做其他的事情垫蛆。 非阻塞寫也是如此禽最。一個線程請求寫入一些數(shù)據(jù)到某通道,但不需要等待它完全寫入袱饭,這個線程同時可以去做別的事情川无。 線程通常將非阻塞IO的空閑時間用于在其它通道上執(zhí)行IO操作,所以一個單獨的線程現(xiàn)在可以管理多個輸入和輸出通道(channel)虑乖。

最后

抱歉這是一篇搬運后排版出來的文章懦趋,花了點時間整理了下Netty框架相關(guān)的知識。尤其是NIO這一塊疹味,雖然網(wǎng)上的言論都是不建議直接基于JDK的NIO類庫進(jìn)行開發(fā)仅叫,幾乎都推薦使用Netty開發(fā)NIO服務(wù)端帜篇,但是了解NIO的一些核心概念,肯定有助于對Netty整個代碼模式以及API使用的學(xué)習(xí)诫咱。這兩天會再整理一下在Android客戶端開發(fā)中Netty的具體使用笙隙。

相關(guān)鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市掏呼,隨后出現(xiàn)的幾起案子坏快,更是在濱河造成了極大的恐慌,老刑警劉巖憎夷,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件莽鸿,死亡現(xiàn)場離奇詭異,居然都是意外死亡拾给,警方通過查閱死者的電腦和手機(jī)祥得,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蒋得,“玉大人啃沪,你說我怎么就攤上這事≌” “怎么了创千?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長入偷。 經(jīng)常有香客問我追驴,道長,這世上最難降的妖魔是什么疏之? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任殿雪,我火速辦了婚禮,結(jié)果婚禮上锋爪,老公的妹妹穿的比我還像新娘丙曙。我一直安慰自己,他們只是感情好其骄,可當(dāng)我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布亏镰。 她就那樣靜靜地躺著,像睡著了一般拯爽。 火紅的嫁衣襯著肌膚如雪索抓。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天,我揣著相機(jī)與錄音逼肯,去河邊找鬼耸黑。 笑死,一個胖子當(dāng)著我的面吹牛篮幢,可吹牛的內(nèi)容都是我干的大刊。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼三椿,長吁一口氣:“原來是場噩夢啊……” “哼奈揍!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起赋续,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎另患,沒想到半個月后纽乱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡昆箕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年鸦列,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鹏倘。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡薯嗤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出纤泵,到底是詐尸還是另有隱情骆姐,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布捏题,位于F島的核電站玻褪,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏公荧。R本人自食惡果不足惜带射,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望循狰。 院中可真熱鬧窟社,春花似錦、人聲如沸绪钥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽程腹。三九已至钠四,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背缀去。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工侣灶, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人缕碎。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓褥影,卻偏偏與公主長得像,于是被迫代替她去往敵國和親咏雌。 傳聞我的和親對象是個殘疾皇子凡怎,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容