摘要:通過進行網絡編程,可以提高網絡通信的開發效率的同時大大提高網絡通信的效率。用于初始化,創建為的類型。實現傳輸對象的和都依賴于自定義的進行定義。到這里一個簡單的就實現完畢了。
通過java進行網絡編程,netty可以提高網絡通信的開發效率的同時大大提高網絡通信的效率。下面來看下如何使用netty進行高效編程。
引入依賴io.nettynetty-all 4.0.25.Final
netty3和netty4在編程api上有一定的區別,本篇是通過netty4進行實踐的。
服務端句柄對象io.netty.bootstrap.ServerBootstrapnetty服務端和客戶端的創建都是依賴于Bootstrap句柄對象,下面我們看下服務端是如何通過ServerBootstrap創建服務的。
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對象的屬性:
io.netty.bootstrap.ServerBootstrap#group(io.netty.channel.EventLoopGroup, io.netty.channel.EventLoopGroup)第一個參數是用于接收請求的EventLoopGroup,第二個參數是處理請求的EventLoopGroup。
io.netty.bootstrap.AbstractBootstrap#channel用于初始化channelFactory,channel創建為NioServerSocketChannel的類型。
io.netty.bootstrap.AbstractBootstrap#localAddress(java.net.SocketAddress)這個沒什么好說的設置監聽的地址。
io.netty.bootstrap.ServerBootstrap#childHandler數據流的handler處理器,上面我們設置了四個handler,分別有數據流出和流進是待處理的handler鏈。
上面都是在初始化句柄接下來,serverBootstrap.bind().sync()同步開啟服務。
客戶端句柄對象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));
客戶端句柄初始化相對來說簡單,初始化處理EventLoopGroup,channel factory,handler處理鏈,最后connect就可以連接到netty的服務端了。
handler實現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
傳輸對象的encode和decode都依賴于自定義的NettyCommand進行定義。
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"); } }
到這里一個簡單的hello netty就實現完畢了。
后記到這里整個腦袋還不是太清晰,可能是因為初次使用netty,很多深入的原理性東西還沒有充分的認識到,后面不斷學習升華。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/66129.html
摘要:線程切換效率低下單機核數固定,線程爆炸之后操作系統頻繁進行線程切換,應用性能急劇下降。線程切換效率低下由于模型中線程數量大大降低,線程切換效率因此也大幅度提高。將兩個線程優雅地關閉。創建管道的子處理器,用于處理。 Netty+SpringBoot+FastDFS+Html5實現聊天App,項目介紹:https://segmentfault.com/a/11... Netty+Sprin...
摘要:線程切換效率低下單機核數固定,線程爆炸之后操作系統頻繁進行線程切換,應用性能急劇下降。線程切換效率低下由于模型中線程數量大大降低,線程切換效率因此也大幅度提高。將兩個線程優雅地關閉。創建管道的子處理器,用于處理。 Netty+SpringBoot+FastDFS+Html5實現聊天App,項目介紹:https://segmentfault.com/a/11... Netty+Sprin...
摘要:零前期準備版本版本核心依賴包支持包簡介是官方出品的微服務框架,底層基于驅動,大致的使用套路和相差不是很多筆者只是淺淺的了解過,可能存在理解不透的情況。一配置中的配置類有兩種,一種是用于讀取配置文件的,另一種是用于配置服務器對象的。 零 前期準備 0 版本 JDK 版本 : OpenJDK 11.0.1 IDE : idea 2018.3 Helidon Webserver : heli...
摘要:提供異步的事件驅動的網絡應用程序框架和工具,用以快速開發高性能高可靠性的網絡服務器和客戶端程序。總結我們完成了服務端的簡單搭建,模擬了聊天會話場景。 之前一直在搞前端的東西,都快忘了自己是個java開發。其實還有好多java方面的東西沒搞過,突然了解到netty,覺得有必要學一學。 介紹 Netty是由JBOSS提供的一個java開源框架。Netty提供異步的、事件驅動的網絡應用程序框...
閱讀 1411·2021-10-08 10:04
閱讀 733·2021-09-07 09:58
閱讀 2912·2019-08-30 15:55
閱讀 2424·2019-08-29 17:21
閱讀 2126·2019-08-28 18:04
閱讀 3075·2019-08-28 17:57
閱讀 715·2019-08-26 11:46
閱讀 2228·2019-08-23 17:20