摘要:它甚至使用不安全的偽隨機(jī)生成器在內(nèi)部更快地生成項(xiàng)目源碼一個簡單的應(yīng)答通訊的實(shí)例判斷是否加密監(jiān)聽本地服務(wù)監(jiān)聽端口發(fā)送消息的大小,用于公共抽象類,安全套接字協(xié)議實(shí)現(xiàn)充當(dāng)工廠和。
本博客 貓叔的博客,轉(zhuǎn)載請申明出處Echo簡易通訊案例閱讀本文約 “4分鐘”
適讀人群:Java-Netty 初級
版本:netty 4.1.*申明:本文旨在重新分享討論Netty官方相關(guān)案例,添加部分個人理解與要點(diǎn)解析。
這個是InChat的案例地址,里面補(bǔ)充了詳細(xì)的注釋,比起官方會容易看一點(diǎn)。
官方案例地址:https://netty.io/4.1/xref/io/...
正文EchoClient(客戶端)
EchoClientHandler
EchoServer(服務(wù)端)
EchoServerHandler
要點(diǎn)介紹SslContext
官方介紹:https://netty.io/4.1/api/io/n...
公共抽象類,安全套接字協(xié)議實(shí)現(xiàn)充當(dāng)工廠SSLEngine和SslHandler。在內(nèi)部,它通過JDK SSLContext或OpenSSL 實(shí)現(xiàn)SSL_CTX,還有關(guān)于它的使用方式,如果你需要ssl加密的話
SslContextBuilder
官方介紹:https://netty.io/4.1/api/io/n...
用于配置新SslContext以進(jìn)行創(chuàng)建的構(gòu)建器,其中包含多個方法這里就不多補(bǔ)充,大家可以去看看
InsecureTrustManagerFactory
官方介紹:https://netty.io/4.1/api/io/n...
在TrustManagerFactory沒有任何驗(yàn)證的情況下信任所有X.509證書的不安全因素
注意:切勿TrustManagerFactory在生產(chǎn)中使用它。它純粹是出于測試目的,因此非常不安全。
SelfSignedCertificate
官方介紹:https://netty.io/4.1/api/io/n...
生成臨時自簽名證書以進(jìn)行測試
注意:切勿在生產(chǎn)中使用此類生成的證書和私鑰。它純粹是出于測試目的,因此非常不安全。它甚至使用不安全的偽隨機(jī)生成器在內(nèi)部更快地生成項(xiàng)目源碼
EchoClient
/** * @ClassName EchoClient * @Description 一個簡單的應(yīng)答通訊的實(shí)例 * @Author MySelf * @Date 2019/8/17 17:56 * @Version 1.0 **/ public final class EchoClient { //判斷是否加密 static final boolean SSL = System.getProperty("ssl") != null; //監(jiān)聽本地服務(wù) static final String HOST = System.getProperty("host", "127.0.0.1"); //監(jiān)聽端口 static final int PORT = Integer.parseInt(System.getProperty("port", "8007")); //發(fā)送消息的大小,用于EchoClientHandler static final int SIZE = Integer.parseInt(System.getProperty("size", "256")); public static void main(String[] args) throws Exception { //公共抽象類,安全套接字協(xié)議實(shí)現(xiàn)充當(dāng)工廠SSLEngine和SslHandler。在內(nèi)部,它通過JDK SSLContext或OpenSSL 實(shí)現(xiàn)SSL_CTX final SslContext sslCtx; if (SSL){ //用于配置新SslContext以進(jìn)行創(chuàng)建的構(gòu)建器 sslCtx = SslContextBuilder.forClient() //用于驗(yàn)證遠(yuǎn)程端點(diǎn)證書的可信管理器 //InsecureTrustManagerFactory:在TrustManagerFactory沒有任何驗(yàn)證的情況下信任所有X.509證書的不安全因素 //注:切勿TrustManagerFactory在生產(chǎn)中使用它。它純粹是出于測試目的,因此非常不安全。 .trustManager(InsecureTrustManagerFactory.INSTANCE).build(); }else { sslCtx = null; } //事件循環(huán) EventLoopGroup group = new NioEventLoopGroup(); try { Bootstrap b = new Bootstrap(); b.group(group) .channel(NioSocketChannel.class) .option(ChannelOption.TCP_NODELAY,true) .handler(new ChannelInitializer() { @Override protected void initChannel(SocketChannel sc) throws Exception { ChannelPipeline p = sc.pipeline(); //了解SslContext的用法 if (sslCtx != null){ p.addLast(sslCtx.newHandler(sc.alloc(),HOST,PORT)); } p.addLast(new EchoClientHandler()); } }); //這個sync后的代碼均會執(zhí)行 ChannelFuture f = b.connect(HOST,PORT).sync(); System.out.println("before-----"); //這個sync后的代碼不會執(zhí)行 f.channel().closeFuture().sync(); System.out.println("after-----"); }finally { group.shutdownGracefully(); } } }
EchoClientHandler
/** * @ClassName EchoClientHandler * @Description TODO * @Author MySelf * @Date 2019/8/17 18:06 * @Version 1.0 **/ public class EchoClientHandler extends ChannelInboundHandlerAdapter { private final ByteBuf firstMessage; public EchoClientHandler(){ //獲取EchoClient的SIZE //Unpooled:ByteBuf通過分配新空間或通過包裝或復(fù)制現(xiàn)有字節(jié)數(shù)組,字節(jié)緩沖區(qū)和字符串來創(chuàng)建新的 firstMessage = Unpooled.buffer(EchoClient.SIZE); for (int i = 0; i < firstMessage.capacity(); i++){ firstMessage.writeByte((byte)i); } } @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { ctx.writeAndFlush(firstMessage); } @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { ctx.write(msg); } @Override public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { ctx.flush(); } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { cause.printStackTrace(); ctx.close(); } }
EchoServer
/** * @ClassName EchoServer * @Description 服務(wù)端 * @Author MySelf * @Date 2019/8/17 18:15 * @Version 1.0 **/ public final class EchoServer { static final boolean SSL = System.getProperty("ssl") != null; static final int PORT = Integer.parseInt(System.getProperty("port", "8007")); public static void main(String[] args) throws Exception { final SslContext sslCtx; if (SSL){ //SelfSignedCertificate:生成臨時自簽名證書以進(jìn)行測試 SelfSignedCertificate ssc = new SelfSignedCertificate(); sslCtx = SslContextBuilder.forServer(ssc.certificate(), ssc.privateKey()).build(); }else{ sslCtx = null; } EventLoopGroup bossGroup = new NioEventLoopGroup(1); EventLoopGroup workerGroup = new NioEventLoopGroup(); final EchoServerHandler serverHandler = new EchoServerHandler(); try { ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup,workerGroup) .channel(NioServerSocketChannel.class) .option(ChannelOption.SO_BACKLOG,100) .handler(new LoggingHandler(LogLevel.INFO)) .childHandler(new ChannelInitializer() { @Override protected void initChannel(SocketChannel ch) throws Exception { ChannelPipeline p = ch.pipeline(); if (sslCtx != null){ p.addLast(sslCtx.newHandler(ch.alloc())); } p.addLast(serverHandler); } }); ChannelFuture f = b.bind(PORT).sync(); f.channel().closeFuture().sync(); }finally { bossGroup.shutdownGracefully(); workerGroup.shutdownGracefully(); } } }
EchoServerHandler
/** * @ClassName EchoServerHandler * @Description TODO * @Author MySelf * @Date 2019/8/17 18:14 * @Version 1.0 **/ @ChannelHandler.Sharable public class EchoServerHandler extends ChannelInboundHandlerAdapter { @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { ctx.write(msg); } @Override public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { ctx.flush(); } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { cause.printStackTrace(); ctx.close(); } }公眾號:Java貓說
學(xué)習(xí)交流群:728698035
現(xiàn)架構(gòu)設(shè)計(jì)(碼農(nóng))兼創(chuàng)業(yè)技術(shù)顧問,不羈平庸,熱愛開源,雜談程序人生與不定期干貨。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/76274.html
摘要:廢話不多說直接看效果圖代碼很好理解,但是在看代碼之前需要知道雙向綁定的原理其實(shí)就是基于實(shí)現(xiàn)的雙向綁定官方傳送門這里我們用官方的話來說方法會直接在一個對象上定義一個新屬性,或者修改一個對象的現(xiàn)有屬性,并返回這個對象。 廢話不多說直接看效果圖 showImg(https://segmentfault.com/img/bVbiYY5?w=282&h=500); 代碼很好理解,但是在看代碼之前...
摘要:廢話不多說直接看效果圖代碼很好理解,但是在看代碼之前需要知道雙向綁定的原理其實(shí)就是基于實(shí)現(xiàn)的雙向綁定官方傳送門這里我們用官方的話來說方法會直接在一個對象上定義一個新屬性,或者修改一個對象的現(xiàn)有屬性,并返回這個對象。 廢話不多說直接看效果圖 showImg(https://segmentfault.com/img/bVbiYY5?w=282&h=500); 代碼很好理解,但是在看代碼之前...
摘要:最近在看,讀完官方的起步教程后想著該自己折騰點(diǎn)東西,就先用實(shí)現(xiàn)一個超簡單的,主要記錄下思路。先推薦一個入門級的簡單實(shí)戰(zhàn)項(xiàng)目地址。不過鑒于初學(xué),自身的思路肯定不會是最佳實(shí)踐,慢慢積累。 最近在看node.js,讀完官方的起步教程后想著該自己折騰點(diǎn)東西,就先用express + ejs實(shí)現(xiàn)一個超簡單的webserver,主要記錄下思路。先推薦一個nodejs入門級的簡單實(shí)戰(zhàn)項(xiàng)目地址。很適合...
摘要:基于工廠角色和產(chǎn)品角色的多態(tài)性設(shè)計(jì)是工廠方法模式的關(guān)鍵。工廠方法模式之所以又被稱為多態(tài)工廠模式,是因?yàn)樗械木唧w工廠類都具有同一抽象父類。工廠方法模式總結(jié)工廠方法模式是簡單工廠模式的進(jìn)一步抽象和推廣。 JavaScript工廠模式 首先需要說一下工廠模式。工廠模式根據(jù)抽象程度的不同分為三種 簡單工廠模式 工廠方法模式 抽象工廠模式 1.簡單工廠模式 簡單工廠模式:又稱為靜態(tài)工廠方法...
閱讀 3614·2021-11-15 11:38
閱讀 2810·2021-11-11 16:55
閱讀 2562·2021-11-08 13:22
閱讀 2639·2021-11-02 14:45
閱讀 1321·2021-09-28 09:35
閱讀 2596·2021-09-10 10:50
閱讀 471·2019-08-30 15:44
閱讀 2787·2019-08-29 17:06