摘要:通過(guò)進(jìn)行網(wǎng)絡(luò)編程,可以提高網(wǎng)絡(luò)通信的開(kāi)發(fā)效率的同時(shí)大大提高網(wǎng)絡(luò)通信的效率。用于初始化,創(chuàng)建為的類型。實(shí)現(xiàn)傳輸對(duì)象的和都依賴于自定義的進(jìn)行定義。到這里一個(gè)簡(jiǎn)單的就實(shí)現(xiàn)完畢了。
通過(guò)java進(jìn)行網(wǎng)絡(luò)編程,netty可以提高網(wǎng)絡(luò)通信的開(kāi)發(fā)效率的同時(shí)大大提高網(wǎng)絡(luò)通信的效率。下面來(lái)看下如何使用netty進(jìn)行高效編程。
引入依賴io.nettynetty-all 4.0.25.Final
netty3和netty4在編程api上有一定的區(qū)別,本篇是通過(guò)netty4進(jìn)行實(shí)踐的。
服務(wù)端句柄對(duì)象io.netty.bootstrap.ServerBootstrapnetty服務(wù)端和客戶端的創(chuàng)建都是依賴于Bootstrap句柄對(duì)象,下面我們看下服務(wù)端是如何通過(guò)ServerBootstrap創(chuàng)建服務(wù)的。
serverBootstrap.group(new NioEventLoopGroup(), new NioEventLoopGroup()).channel(NioServerSocketChannel.class) .localAddress(new InetSocketAddress(nettyServerConfig.getListenPort())) .childHandler(new ChannelInitializer() { @Override public void initChannel(SocketChannel ch) throws Exception { ch.pipeline().addLast( new NettyEncoder(), new NettyDecoder(), new NettyConnetManageHandler(), new EchoServerHandler()); } }); ChannelFuture f = serverBootstrap.bind().sync();
大家去看源碼就可以知道上面都是在初始化ServerBootstrap對(duì)象的屬性:
io.netty.bootstrap.ServerBootstrap#group(io.netty.channel.EventLoopGroup, io.netty.channel.EventLoopGroup)第一個(gè)參數(shù)是用于接收請(qǐng)求的EventLoopGroup,第二個(gè)參數(shù)是處理請(qǐng)求的EventLoopGroup。
io.netty.bootstrap.AbstractBootstrap#channel用于初始化channelFactory,channel創(chuàng)建為NioServerSocketChannel的類型。
io.netty.bootstrap.AbstractBootstrap#localAddress(java.net.SocketAddress)這個(gè)沒(méi)什么好說(shuō)的設(shè)置監(jiān)聽(tīng)的地址。
io.netty.bootstrap.ServerBootstrap#childHandler數(shù)據(jù)流的handler處理器,上面我們?cè)O(shè)置了四個(gè)handler,分別有數(shù)據(jù)流出和流進(jìn)是待處理的handler鏈。
上面都是在初始化句柄接下來(lái),serverBootstrap.bind().sync()同步開(kāi)啟服務(wù)。
客戶端句柄對(duì)象io.netty.bootstrap.Bootstrapbootstrap.group(new NioEventLoopGroup()).channel(NioSocketChannel.class) .handler(new ChannelInitializer() { @Override public void initChannel(SocketChannel ch) throws Exception { ch.pipeline().addLast( new NettyEncoder(), new NettyDecoder(), new NettyClientHandler()); } }); bootstrap.connect(new InetSocketAddress(ip, port));
客戶端句柄初始化相對(duì)來(lái)說(shuō)簡(jiǎn)單,初始化處理EventLoopGroup,channel factory,handler處理鏈,最后connect就可以連接到netty的服務(wù)端了。
handler實(shí)現(xiàn)1、NettyEncoder
public class NettyEncoder extends MessageToByteEncoder{ @Override public void encode(ChannelHandlerContext ctx, NettyCommand msg, ByteBuf out) throws Exception { out.writeBytes(msg.encode()); } }
2、NettyDecoder
public class NettyDecoder extends ByteToMessageDecoder { @Override protected void decode(ChannelHandlerContext ctx, ByteBuf in, List
傳輸對(duì)象的encode和decode都依賴于自定義的NettyCommand進(jìn)行定義。
3、EchoServerHandler
class EchoServerHandler extends ChannelInboundHandlerAdapter { @Override public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { System.out.println("phase: channelReadComplete"); } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { System.out.println("phase: exceptionCaught"); cause.printStackTrace(); ctx.close(); } @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { NettyCommand requestCommand = (NettyCommand) msg; System.out.println("Server received: " + new String(requestCommand.getBody())); processMessageReceive(ctx, requestCommand); } }
4、NettyClientHandler
class NettyClientHandler extends SimpleChannelInboundHandler{ @Override public void channelActive(ChannelHandlerContext ctx) { System.out.println("channelActive"); } @Override protected void channelRead0(ChannelHandlerContext ctx, NettyCommand msg) throws Exception { NettyCommand command = (NettyCommand) msg; processMessageReceive(ctx, command); } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { //4 System.out.println("exceptionCaught"); cause.printStackTrace(); ctx.close(); } @Override public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { System.out.println("channelReadComplete"); } }
到這里一個(gè)簡(jiǎn)單的hello netty就實(shí)現(xiàn)完畢了。
后記到這里整個(gè)腦袋還不是太清晰,可能是因?yàn)槌醮问褂胣etty,很多深入的原理性東西還沒(méi)有充分的認(rèn)識(shí)到,后面不斷學(xué)習(xí)升華。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/66129.html
摘要:線程切換效率低下單機(jī)核數(shù)固定,線程爆炸之后操作系統(tǒng)頻繁進(jìn)行線程切換,應(yīng)用性能急劇下降。線程切換效率低下由于模型中線程數(shù)量大大降低,線程切換效率因此也大幅度提高。將兩個(gè)線程優(yōu)雅地關(guān)閉。創(chuàng)建管道的子處理器,用于處理。 Netty+SpringBoot+FastDFS+Html5實(shí)現(xiàn)聊天App,項(xiàng)目介紹:https://segmentfault.com/a/11... Netty+Sprin...
摘要:線程切換效率低下單機(jī)核數(shù)固定,線程爆炸之后操作系統(tǒng)頻繁進(jìn)行線程切換,應(yīng)用性能急劇下降。線程切換效率低下由于模型中線程數(shù)量大大降低,線程切換效率因此也大幅度提高。將兩個(gè)線程優(yōu)雅地關(guān)閉。創(chuàng)建管道的子處理器,用于處理。 Netty+SpringBoot+FastDFS+Html5實(shí)現(xiàn)聊天App,項(xiàng)目介紹:https://segmentfault.com/a/11... Netty+Sprin...
摘要:零前期準(zhǔn)備版本版本核心依賴包支持包簡(jiǎn)介是官方出品的微服務(wù)框架,底層基于驅(qū)動(dòng),大致的使用套路和相差不是很多筆者只是淺淺的了解過(guò),可能存在理解不透的情況。一配置中的配置類有兩種,一種是用于讀取配置文件的,另一種是用于配置服務(wù)器對(duì)象的。 零 前期準(zhǔn)備 0 版本 JDK 版本 : OpenJDK 11.0.1 IDE : idea 2018.3 Helidon Webserver : heli...
摘要:提供異步的事件驅(qū)動(dòng)的網(wǎng)絡(luò)應(yīng)用程序框架和工具,用以快速開(kāi)發(fā)高性能高可靠性的網(wǎng)絡(luò)服務(wù)器和客戶端程序。總結(jié)我們完成了服務(wù)端的簡(jiǎn)單搭建,模擬了聊天會(huì)話場(chǎng)景。 之前一直在搞前端的東西,都快忘了自己是個(gè)java開(kāi)發(fā)。其實(shí)還有好多java方面的東西沒(méi)搞過(guò),突然了解到netty,覺(jué)得有必要學(xué)一學(xué)。 介紹 Netty是由JBOSS提供的一個(gè)java開(kāi)源框架。Netty提供異步的、事件驅(qū)動(dòng)的網(wǎng)絡(luò)應(yīng)用程序框...
閱讀 1422·2021-10-08 10:04
閱讀 745·2021-09-07 09:58
閱讀 2924·2019-08-30 15:55
閱讀 2475·2019-08-29 17:21
閱讀 2177·2019-08-28 18:04
閱讀 3086·2019-08-28 17:57
閱讀 730·2019-08-26 11:46
閱讀 2264·2019-08-23 17:20