Netty就是這么回事(二)

承接上一章,接下來開始進(jìn)入Netty入門,本文所采用的Netty版本號是5.0州弟,這個請大家注意下钧栖。

還是上一個場景,一個簡單的客戶端和服務(wù)端直接發(fā)送字符串的程序婆翔,如果使用Netty框架如何展示呢拯杠?廢話不多說,直接上代碼啃奴。

服務(wù)端:

package com.dlb.note.server;

importio.netty.bootstrap.ServerBootstrap;

importio.netty.buffer.ByteBuf;

importio.netty.buffer.Unpooled;

importio.netty.channel.*;

importio.netty.channel.nio.NioEventLoopGroup;

importio.netty.channel.socket.SocketChannel;

importio.netty.channel.socket.nio.NioServerSocketChannel;

/**

* 功能:時間服務(wù)器

* 版本:1.0

* 日期:2016年12月8日14:58:06

* 作者:馟蘇

*/

public classTimeServer {

/**

* 主函數(shù)

*/

public static voidmain(String []args) {

// 配置服務(wù)端的NIO線程池

EventLoopGroup bossGroup =newNioEventLoopGroup();

EventLoopGroup workerGroup =newNioEventLoopGroup();

try{

ServerBootstrap serverBootstrap =newServerBootstrap();

serverBootstrap.group(bossGroup,workerGroup)

.channel(NioServerSocketChannel.class)

// 當(dāng)服務(wù)器請求處理線程全滿時潭陪,用于臨時存放已完成三次握手的請求的隊(duì)列的最大長度

.option(ChannelOption.SO_BACKLOG,1024)

.childHandler(newChildChannelHandler());

// 綁定端口,同步等待成功

ChannelFuture future = serverBootstrap.bind(8888).sync();

System.out.println("服務(wù)器在8888端口監(jiān)聽hello");

// 等待服務(wù)端監(jiān)聽端口關(guān)閉

future.channel().closeFuture().sync();

System.out.println("服務(wù)器關(guān)閉bye");

}catch(Exception e) {

e.printStackTrace();

}finally{

// 優(yōu)雅退出最蕾,釋放線程池資源

bossGroup.shutdownGracefully();

workerGroup.shutdownGracefully();

}

}

}

classChildChannelHandlerextendsChannelInitializer {

@Override

protected voidinitChannel(SocketChannel socketChannel)throwsException {

socketChannel.pipeline().addLast(newTimerServerHandler());

}

}

classTimerServerHandlerextendsChannelHandlerAdapter {

// 可讀

@Override

public voidchannelRead(ChannelHandlerContext ctx,Object msg)throwsException {

// 讀數(shù)據(jù)

ByteBuf buf = (ByteBuf) msg;

byte[] req =new byte[buf.readableBytes()];

buf.readBytes(req);

String body =newString(req,"UTF-8");

System.out.println("receive:"+ body);

// 寫數(shù)據(jù)

ByteBuf res = Unpooled.copiedBuffer("hello,client!".getBytes());

ctx.write(res);

ctx.flush();

}

// 連接

@Override

public voidchannelActive(ChannelHandlerContext ctx)throwsException {

System.out.println("client come,ip:"+ ctx.channel().remoteAddress());

}

// 關(guān)閉

@Override

public voidchannelInactive(ChannelHandlerContext ctx)throwsException {

System.out.println("client close,ip:"+ ctx.channel().remoteAddress());

ctx.close();

}

// 異常

@Override

public voidexceptionCaught(ChannelHandlerContext ctx,Throwable cause)throwsException {

System.out.println(cause.toString());

ctx.close();

}

}

現(xiàn)在來分析一下:首先服務(wù)端做了兩個線程池依溯,一個是boss線程池,一個worker線程瘟则,這是Netty框架給我們提供的黎炉。并且在使用完畢后,可以優(yōu)雅的關(guān)閉醋拧。然后做一個服務(wù)器啟動引導(dǎo)serverBootStrap慷嗜,我們可以設(shè)置TCP連接的屬性,Netty給我們提供了很多屬性丹壕。接下來庆械,注冊管道,設(shè)置處理器菌赖,綁定端口監(jiān)聽缭乘。

其中比較重要的是處理器,我們可以這么考慮盏袄,Netty為我們提供了一個管道忿峻,管道中存在許多個處理器。一個客戶端鏈接對應(yīng)著一個管道辕羽。這樣我們就可以把處理邏輯寫在處理器中逛尚。在處理器中我們主要關(guān)心這么幾個方法,可讀:channelRead刁愿、鏈接到來:channelActive绰寞、鏈接斷開:channelInactive、異常:exceptionCaught铣口。并且在鏈接關(guān)閉后滤钱,直接通過ctx.close();可以將關(guān)聯(lián)的通道等都關(guān)閉,并且釋放資源脑题。

客戶端:

package com.dlb.note.client;

importio.netty.bootstrap.Bootstrap;

importio.netty.buffer.ByteBuf;

importio.netty.buffer.Unpooled;

importio.netty.channel.*;

importio.netty.channel.nio.NioEventLoopGroup;

importio.netty.channel.socket.nio.NioSocketChannel;

/**

* 功能:支持tcp粘包/拆包的時間客戶端

* 版本:1.0

* 日期:2016/12/9 15:40

* 作者:馟蘇

*/

public classTimeClient {

/**

* main函數(shù)

*@paramargs

*/

public static voidmain(String []args) {

EventLoopGroup group =newNioEventLoopGroup();

try{

Bootstrap bootstrap =newBootstrap();

bootstrap.group(group)

.channel(NioSocketChannel.class)

.option(ChannelOption.TCP_NODELAY, true)

.handler(newChannelInitializer() {

protected voidinitChannel(Channel channel)throwsException {

channel.pipeline().addLast(newMyHandler());

}

});

// 等待客戶端鏈接成功

ChannelFuture future = bootstrap.connect("localhost",8888).sync();

System.out.println("客戶端鏈接成功件缸!");

// 等待客戶端鏈接關(guān)閉

future.channel().closeFuture().sync();

}catch(Exception e) {

e.printStackTrace();

}finally{

group.shutdownGracefully();

}

}

}

classMyHandlerextendsChannelHandlerAdapter {

@Override

public voidchannelActive(ChannelHandlerContext ctx)throwsException {

for(inti =0;i <1000;i++) {

ByteBuf msg = Unpooled.copiedBuffer(("你好啊,服務(wù)器叔遂,我是revoid八丁争剿!$_".getBytes()));

ctx.writeAndFlush(msg);

}

ctx.close();

super.channelActive(ctx);

}

}

客戶端也是非常簡單的,首先創(chuàng)建一個線程池痊末,然后注冊管道蚕苇,處理器,在鏈接服務(wù)器成功后凿叠,給服務(wù)器發(fā)送消息涩笤。

通過上述介紹,我們可以發(fā)現(xiàn)盒件,通過Netty框架編寫一個簡單的客戶端和服務(wù)端通信程序蹬碧,只需要寥寥幾行就可以實(shí)現(xiàn)。但是仍然還有一個問題沒有解決炒刁,那就是沒有解決锰茉,TCP的粘包和分包問題,這個問題切心,將會在下一章介紹飒筑。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市绽昏,隨后出現(xiàn)的幾起案子协屡,更是在濱河造成了極大的恐慌,老刑警劉巖全谤,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件肤晓,死亡現(xiàn)場離奇詭異,居然都是意外死亡认然,警方通過查閱死者的電腦和手機(jī)补憾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來卷员,“玉大人盈匾,你說我怎么就攤上這事”下猓” “怎么了削饵?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長未巫。 經(jīng)常有香客問我窿撬,道長,這世上最難降的妖魔是什么叙凡? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任劈伴,我火速辦了婚禮,結(jié)果婚禮上握爷,老公的妹妹穿的比我還像新娘跛璧。我一直安慰自己苏遥,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布赡模。 她就那樣靜靜地躺著,像睡著了一般师抄。 火紅的嫁衣襯著肌膚如雪漓柑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天叨吮,我揣著相機(jī)與錄音辆布,去河邊找鬼。 笑死茶鉴,一個胖子當(dāng)著我的面吹牛锋玲,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播涵叮,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼惭蹂,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了割粮?” 一聲冷哼從身側(cè)響起盾碗,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎舀瓢,沒想到半個月后廷雅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡京髓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年航缀,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片堰怨。...
    茶點(diǎn)故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡芥玉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出备图,到底是詐尸還是另有隱情飞傀,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布诬烹,位于F島的核電站砸烦,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏绞吁。R本人自食惡果不足惜幢痘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望家破。 院中可真熱鬧颜说,春花似錦购岗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至玄妈,卻和暖如春乾吻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拟蜻。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工绎签, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人酝锅。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓诡必,卻偏偏與公主長得像,于是被迫代替她去往敵國和親搔扁。 傳聞我的和親對象是個殘疾皇子爸舒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評論 2 359

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

  • netty常用API學(xué)習(xí) netty簡介 Netty是基于Java NIO的網(wǎng)絡(luò)應(yīng)用框架. Netty是一個NIO...
    花丶小偉閱讀 6,012評論 0 20
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)稿蹲,斷路器碳抄,智...
    卡卡羅2017閱讀 134,701評論 18 139
  • 原文地址:http://netty.io/wiki/reference-counted-objects.html ...
    linkinparkzlz閱讀 1,546評論 0 0
  • 上篇文章講解了客戶端與服務(wù)端通信示例,本篇來講解下多客戶端之間是如何通信的场绿,我們以一個聊天室的程序?yàn)槔市А>唧w需求:...
    東升的思考閱讀 4,896評論 0 2
  • 引導(dǎo)類的層次結(jié)構(gòu)包括一個抽象的父類和兩個具體的引導(dǎo)子類,服務(wù)器致力于使用一個父 Channel 來接受來自客戶端的...
    FaDeo_O閱讀 259評論 0 0