精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Java 從零開始手寫 RPC-Netty4 實現客戶端和服務端

開發 后端
Netty是由JBOSS提供的一個java開源框架,現為 Github上的獨立項目。Netty提供異步的、事件驅動的網絡應用程序框架和工具,用以快速開發高性能、高可靠性的網絡服務器和客戶端程序。

[[428830]]

說明

上一篇代碼基于 socket 的實現非常簡單,但是對于實際生產,一般使用 netty。

至于 netty 的優點可以參考:

為什么選擇 netty?[1]

http://houbb.github.io/2019/05/10/netty-definitive-gudie-04-why-netty

java 從零開始手寫 RPC (02)-netty4 實現客戶端和服務端

代碼實現

maven 引入

  1. <dependency> 
  2.     <groupId>io.netty</groupId> 
  3.     <artifactId>netty-all</artifactId> 
  4.     <version>${netty.version}</version> 
  5. </dependency> 

引入 netty 對應的 maven 包,此處為 4.1.17.Final。

服務端代碼實現

netty 的服務端啟動代碼是比較固定的。

  1. package com.github.houbb.rpc.server.core; 
  2.  
  3.  
  4. import com.github.houbb.log.integration.core.Log; 
  5. import com.github.houbb.log.integration.core.LogFactory; 
  6. import com.github.houbb.rpc.server.constant.RpcServerConst; 
  7. import com.github.houbb.rpc.server.handler.RpcServerHandler; 
  8. import io.netty.bootstrap.ServerBootstrap; 
  9. import io.netty.channel.*; 
  10. import io.netty.channel.nio.NioEventLoopGroup; 
  11. import io.netty.channel.socket.nio.NioServerSocketChannel; 
  12.  
  13.  
  14. /** 
  15.  * rpc 服務端 
  16.  * @author binbin.hou 
  17.  * @since 0.0.1 
  18.  */ 
  19. public class RpcServer extends Thread { 
  20.  
  21.  
  22.     private static final Log log = LogFactory.getLog(RpcServer.class); 
  23.  
  24.  
  25.     /** 
  26.      * 端口號 
  27.      */ 
  28.     private final int port; 
  29.  
  30.  
  31.     public RpcServer() { 
  32.         this.port = RpcServerConst.DEFAULT_PORT; 
  33.     } 
  34.  
  35.  
  36.     public RpcServer(int port) { 
  37.         this.port = port; 
  38.     } 
  39.  
  40.  
  41.     @Override 
  42.     public void run() { 
  43.         // 啟動服務端 
  44.         log.info("RPC 服務開始啟動服務端"); 
  45.  
  46.  
  47.         EventLoopGroup bossGroup = new NioEventLoopGroup(); 
  48.         EventLoopGroup workerGroup = new NioEventLoopGroup(); 
  49.  
  50.  
  51.         try { 
  52.             ServerBootstrap serverBootstrap = new ServerBootstrap(); 
  53.             serverBootstrap.group(workerGroup, bossGroup) 
  54.                     .channel(NioServerSocketChannel.class) 
  55.                     .childHandler(new ChannelInitializer<Channel>() { 
  56.                         @Override 
  57.                         protected void initChannel(Channel ch) throws Exception { 
  58.                             ch.pipeline().addLast(new RpcServerHandler()); 
  59.                         } 
  60.                     }) 
  61.                     // 這個參數影響的是還沒有被accept 取出的連接 
  62.                     .option(ChannelOption.SO_BACKLOG, 128) 
  63.                     // 這個參數只是過一段時間內客戶端沒有響應,服務端會發送一個 ack 包,以判斷客戶端是否還活著。 
  64.                     .childOption(ChannelOption.SO_KEEPALIVE, true); 
  65.  
  66.  
  67.             // 綁定端口,開始接收進來的鏈接 
  68.             ChannelFuture channelFuture = serverBootstrap.bind(port).syncUninterruptibly(); 
  69.             log.info("RPC 服務端啟動完成,監聽【" + port + "】端口"); 
  70.  
  71.  
  72.             channelFuture.channel().closeFuture().syncUninterruptibly(); 
  73.             log.info("RPC 服務端關閉完成"); 
  74.         } catch (Exception e) { 
  75.             log.error("RPC 服務異常", e); 
  76.         } finally { 
  77.             workerGroup.shutdownGracefully(); 
  78.             bossGroup.shutdownGracefully(); 
  79.         } 
  80.     } 
  81.  
  82.  

為了簡單,服務端啟動端口號固定,RpcServerConst 常量類內容如下:

  1. public final class RpcServerConst { 
  2.  
  3.  
  4.     private RpcServerConst(){} 
  5.  
  6.  
  7.     /** 
  8.      * 默認端口 
  9.      * @since 0.0.1 
  10.      */ 
  11.     public static final int DEFAULT_PORT = 9627; 
  12.  
  13.  

RpcServerHandler

當然,還有一個比較核心的類就是 RpcServerHandler

  1. public class RpcServerHandler extends SimpleChannelInboundHandler { 
  2.     @Override 
  3.     protected void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception { 
  4.         // do nothing now 
  5.     } 

目前是空實現,后續可以添加對應的日志輸出及邏輯處理。

測試

啟動測試的代碼非常簡單:

  1. /** 
  2.  * 服務啟動代碼測試 
  3.  * @param args 參數 
  4.  */ 
  5. public static void main(String[] args) { 
  6.     new RpcServer().start(); 

說明

上面我們實現了服務端的實現,這一節來一起看一下 client 客戶端代碼實現。

代碼實現

RpcClient

  1. /* 
  2.  * Copyright (c)  2019. houbinbin Inc. 
  3.  * rpc All rights reserved. 
  4.  */ 
  5.  
  6.  
  7. package com.github.houbb.rpc.client.core; 
  8.  
  9.  
  10. import com.github.houbb.log.integration.core.Log; 
  11. import com.github.houbb.log.integration.core.LogFactory; 
  12. import com.github.houbb.rpc.client.handler.RpcClientHandler; 
  13.  
  14.  
  15. import io.netty.bootstrap.Bootstrap; 
  16. import io.netty.channel.Channel; 
  17. import io.netty.channel.ChannelFuture; 
  18. import io.netty.channel.ChannelInitializer; 
  19. import io.netty.channel.ChannelOption; 
  20. import io.netty.channel.EventLoopGroup; 
  21. import io.netty.channel.nio.NioEventLoopGroup; 
  22. import io.netty.channel.socket.nio.NioSocketChannel; 
  23. import io.netty.handler.logging.LogLevel; 
  24. import io.netty.handler.logging.LoggingHandler; 
  25.  
  26.  
  27. /** 
  28.  * <p> rpc 客戶端 </p> 
  29.  * 
  30.  * <pre> Created: 2019/10/16 11:21 下午  </pre> 
  31.  * <pre> Project: rpc  </pre> 
  32.  * 
  33.  * @author houbinbin 
  34.  * @since 0.0.2 
  35.  */ 
  36. public class RpcClient extends Thread { 
  37.  
  38.  
  39.     private static final Log log = LogFactory.getLog(RpcClient.class); 
  40.  
  41.  
  42.     /** 
  43.      * 監聽端口號 
  44.      */ 
  45.     private final int port; 
  46.  
  47.  
  48.     public RpcClient(int port) { 
  49.         this.port = port; 
  50.     } 
  51.  
  52.  
  53.     public RpcClient() { 
  54.         this(9527); 
  55.     } 
  56.  
  57.  
  58.     @Override 
  59.     public void run() { 
  60.         // 啟動服務端 
  61.         log.info("RPC 服務開始啟動客戶端"); 
  62.  
  63.  
  64.         EventLoopGroup workerGroup = new NioEventLoopGroup(); 
  65.  
  66.  
  67.         try { 
  68.             Bootstrap bootstrap = new Bootstrap(); 
  69.             ChannelFuture channelFuture = bootstrap.group(workerGroup) 
  70.                     .channel(NioSocketChannel.class) 
  71.                     .option(ChannelOption.SO_KEEPALIVE, true
  72.                     .handler(new ChannelInitializer<Channel>(){ 
  73.                         @Override 
  74.                         protected void initChannel(Channel ch) throws Exception { 
  75.                             ch.pipeline() 
  76.                                     .addLast(new LoggingHandler(LogLevel.INFO)) 
  77.                                     .addLast(new RpcClientHandler()); 
  78.                         } 
  79.                     }) 
  80.                     .connect("localhost", port) 
  81.                     .syncUninterruptibly(); 
  82.  
  83.  
  84.             log.info("RPC 服務啟動客戶端完成,監聽端口:" + port); 
  85.             channelFuture.channel().closeFuture().syncUninterruptibly(); 
  86.             log.info("RPC 服務開始客戶端已關閉"); 
  87.         } catch (Exception e) { 
  88.             log.error("RPC 客戶端遇到異常", e); 
  89.         } finally { 
  90.             workerGroup.shutdownGracefully(); 
  91.         } 
  92.     } 
  93.  
  94.  

.connect("localhost", port) 聲明了客戶端需要連接的服務端,此處和服務端的端口保持一致。

RpcClientHandler

客戶端處理類也比較簡單,暫時留空。

  1. /* 
  2.  * Copyright (c)  2019. houbinbin Inc. 
  3.  * rpc All rights reserved. 
  4.  */ 
  5.  
  6.  
  7. package com.github.houbb.rpc.client.handler; 
  8.  
  9.  
  10. import io.netty.channel.ChannelHandlerContext; 
  11. import io.netty.channel.SimpleChannelInboundHandler; 
  12.  
  13.  
  14. /** 
  15.  * <p> 客戶端處理類 </p> 
  16.  * 
  17.  * <pre> Created: 2019/10/16 11:30 下午  </pre> 
  18.  * <pre> Project: rpc  </pre> 
  19.  * 
  20.  * @author houbinbin 
  21.  * @since 0.0.2 
  22.  */ 
  23. public class RpcClientHandler extends SimpleChannelInboundHandler { 
  24.  
  25.  
  26.     @Override 
  27.     protected void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception { 
  28.         // do nothing. 
  29.     } 
  30.  
  31.  

啟動測試

服務端

首先啟動服務端。

客戶端

然后啟動客戶端連接服務端,實現如下:

  1. /** 
  2.  * 服務啟動代碼測試 
  3.  * @param args 參數 
  4.  */ 
  5. public static void main(String[] args) { 
  6.     new RpcClient().start(); 

小結

為了便于大家學習,以上源碼已經開源:

https://github.com/houbb/rpc

我是老馬,期待與你的下次重逢。

References

[1] 為什么選擇 netty?: http://houbb.github.io/2019/05/10/netty-definitive-gudie-04-why-netty

 

責任編輯:姜華 來源: 今日頭條
相關推薦

2021-10-19 08:58:48

Java 語言 Java 基礎

2021-10-21 08:21:10

Java Reflect Java 基礎

2021-10-27 08:10:15

Java 客戶端 Java 基礎

2022-06-14 15:07:04

IPC客戶端服務端

2021-10-13 08:21:52

Java websocket Java 基礎

2018-12-20 08:50:53

TCPIP服務器

2010-03-01 16:10:32

Linux Samba

2012-05-07 13:55:41

JavaJava Web

2010-03-19 09:26:34

Java Socket

2021-10-20 08:05:18

Java 序列化 Java 基礎

2010-01-11 13:05:24

VNC server配

2022-01-05 08:03:23

C#通信Rest

2009-08-21 15:54:40

服務端與客戶端

2009-08-21 15:36:41

服務端與客戶端

2021-10-29 08:07:30

Java timeout Java 基礎

2010-03-18 17:47:07

Java 多客戶端通信

2023-11-17 09:13:36

2009-08-21 15:59:22

服務端與客戶端通信

2009-08-21 16:14:52

服務端與客戶端通信

2011-09-09 09:44:23

WCF
點贊
收藏

51CTO技術棧公眾號

日韩1区2区日韩1区2区| 久久综合影院| 亚洲成人自拍网| 九色91在线视频| 在线观看免费黄色小视频| 91精品二区| 日韩精品小视频| 亚洲综合欧美激情| 欧美xxxx视频| 国产三级欧美三级| 亚洲综合精品一区二区| 在线能看的av| 亚洲成人免费| 精品亚洲aⅴ在线观看| 日本中文字幕二区| 中文日产幕无线码一区二区| 亚洲美女屁股眼交| 日韩精品久久一区二区三区| www.av网站| 日韩精品亚洲专区| 国产69精品久久久| 四虎地址8848| 国产精品欧美三级在线观看| 日韩欧美亚洲国产另类| 免费涩涩18网站入口| 高潮在线视频| 亚洲精品国产视频| 亚洲国产精品一区二区第一页| 女人18毛片一区二区三区| 欧美aaaaaa午夜精品| 97碰在线观看| 久久综合色综合| 欧美国产一区二区三区激情无套| 亚洲精品少妇网址| 强迫凌虐淫辱の牝奴在线观看| 亚洲人成777| 在线观看日韩精品| 日韩毛片在线免费看| bl视频在线免费观看| 综合欧美一区二区三区| 日韩高清三级| 国产一区二区三区福利| 久久久天堂av| 蜜桃av久久久亚洲精品| 日韩一卡二卡在线| 懂色av一区二区三区蜜臀| 91中文字幕在线| 国产又色又爽又黄又免费| 全部av―极品视觉盛宴亚洲| 国产成人av网址| 国内自拍视频在线播放| 一区二区三区国产盗摄| 91av在线影院| 91午夜视频在线观看| 亚洲乱码久久| 91精品国产色综合久久不卡98口| 国产真实乱偷精品视频| 欧美日韩岛国| 国内精品久久久久久久| 久久久国产精品黄毛片| 欧美精品综合| 992tv在线成人免费观看| 日韩av片在线播放| 在线观看一区| 欧美一区二区大胆人体摄影专业网站| 日韩av一区二区在线播放| 99精品热视频只有精品10| 91av视频在线播放| 日本中文字幕久久| 捆绑调教美女网站视频一区| 成人激情视频在线| 亚洲国产精品成人久久蜜臀| 豆国产96在线|亚洲| 国产伦精品一区二区三区四区免费| 国产成人手机在线| 91丨国产丨九色丨pron| 亚洲国产高清国产精品| 黄在线免费观看| 亚洲国产精品综合小说图片区| 日本午夜激情视频| 四虎4545www国产精品| 欧美日韩国产一级片| 日韩精品视频网址| 国产毛片久久久| 亚洲性av在线| 麻豆天美蜜桃91| 亚洲美女网站| 国产精品人成电影| www日本视频| 久久天堂av综合合色蜜桃网| 中文字幕欧美日韩一区二区| 色噜噜狠狠狠综合欧洲色8| 欧美视频不卡中文| 日韩精品你懂的| 国产精品视屏| 中文字幕综合在线| 国产亚洲精品久久久久久打不开| 另类天堂av| 91亚洲人电影| 国产中文字幕在线观看| 一区二区三区在线观看视频| 99爱视频在线| 亚洲国产aⅴ精品一区二区| 亚洲欧美另类国产| 青青草激情视频| 久热精品在线| 99久久精品久久久久久ai换脸| 免费播放片a高清在线观看| 亚洲另类在线视频| 亚欧在线免费观看| 欧美成人一区在线观看| 久久久精品日本| 中文字幕在线观看视频免费| 国产麻豆精品95视频| 日韩欧美激情一区二区| www.综合| 欧美一级二级三级乱码| av永久免费观看| 夜夜精品视频| 超碰97人人人人人蜜桃| 69xxxx欧美| 色先锋aa成人| 中文字幕在线播放一区| 亚洲成人99| 国产精品入口日韩视频大尺度| 婷婷五月综合激情| 一区二区三区四区不卡视频| 香港日本韩国三级网站| 久久99视频| 2023亚洲男人天堂| 人妻中文字幕一区| 一卡二卡欧美日韩| 交换做爰国语对白| 国产韩日影视精品| 国产日韩换脸av一区在线观看| 人操人视频在线观看| 亚洲成人精品一区二区| 男人添女人荫蒂国产| 国产精品久久久久久| 国产精品一区二区三| 第三区美女视频在线| 色一区在线观看| japanese中文字幕| 性久久久久久| 欧美日韩亚洲综合一区二区三区激情在线| 波多野结依一区| 日韩免费电影一区| 欧美三级免费看| 国产精品正在播放| 亚洲天堂第一区| 试看120秒一区二区三区| 久久这里有精品| a天堂在线观看视频| 亚洲日本在线a| 免费观看黄网站| 亚洲精品一区二区妖精| 2014国产精品| 欧美黄色视屏| 亚洲精品国产精品国自产在线| 中文字幕在线观看免费视频| av高清久久久| 国产欧美在线一区| 成人av资源电影网站| 91精品久久久久久综合乱菊 | 国产激情视频一区二区三区欧美| 偷拍盗摄高潮叫床对白清晰| 免费精品一区| 韩国美女主播一区| 精品影院一区| 欧美三级电影精品| 精品自拍偷拍视频| 北岛玲一区二区三区四区| 日韩激情免费视频| 日韩精品第一区| 亚洲综合第一页| 亚洲优女在线| 日韩一区二区三区在线播放| 亚洲国产精品久久人人爱潘金莲 | 69xxxx国产| 国产精品久久久一本精品 | 久久综合久色欧美综合狠狠| 十八禁视频网站在线观看| 久久影院一区| 国产精品久久精品国产| 玛雅亚洲电影| 久久精品久久精品亚洲人| 俄罗斯嫩小性bbwbbw| 在线精品亚洲一区二区不卡| 九九精品视频免费| 成人av免费观看| 成人中文字幕av| 午夜激情一区| 日韩成人av电影在线| 日韩精品三级| 日韩女优在线播放| 激情av在线| 国产亚洲一区二区精品| 午夜精品在线播放| 91福利视频在线| 久久无码精品丰满人妻| 国产日韩欧美一区二区三区乱码| 能看毛片的网站| 欧美aaaaaa午夜精品| 欧美视频免费看欧美视频| 日韩久久视频| 免费精品视频一区| 国产精品22p| 成人免费高清完整版在线观看| 成人免费观看在线观看| 日韩中文字幕视频| 男操女在线观看| 精品久久久久久久久久久久久久久久久 | 中文字幕亚洲不卡| 精品无码在线视频| 国产精品一区二区在线播放| 久久久国产欧美| 亚洲一区不卡| 日韩精品一区在线视频| 亚洲情侣在线| 一区二区三区四区| 国产麻豆精品久久| 欧美精品一区二区三区四区五区| 国产精品白丝一区二区三区 | 精品福利网址导航| 91日本视频在线| 不卡亚洲精品| 国产成人一区二区三区电影| 麻豆蜜桃在线观看| 欧美激情视频播放| www视频在线看| 色婷婷**av毛片一区| av在线资源网| 国产午夜精品一区理论片飘花| 外国精品视频在线观看 | 中国免费黄色片| 国产一二精品视频| 四季av一区二区| 视频一区二区中文字幕| 男人靠女人免费视频网站| 亚洲美女网站| 黄色免费视频大全| 香蕉av777xxx色综合一区| heyzo亚洲| 中文久久精品| 欧美爱爱视频免费看| 日韩一级欧洲| 99精品视频播放| 久久天堂精品| 看欧美ab黄色大片视频免费| 日韩国产一区二| 日日噜噜夜夜狠狠| 久99久精品视频免费观看| 五月激情五月婷婷| 国产精品一区二区久久不卡| 中文字幕在线播放一区二区| 国产精品1024久久| 亚洲一二三四五| 成人h版在线观看| 国产国语性生话播放| 久久免费的精品国产v∧| 久久精品国产亚洲av久| 国产欧美精品在线观看| 亚洲欧美精品久久| 亚洲欧美乱综合| 欧美亚洲天堂网| 色综合久久久久久久久| 中文字幕av网站| 日韩午夜av电影| 天天操天天干天天爱| 亚洲欧美在线播放| 午夜视频在线| 欧美激情第99页| 女人让男人操自己视频在线观看 | 911亚洲精品| 精品国产二区在线| 欧美亚洲激情| 7777在线视频| 亚洲视频1区| 国产精品自拍视频在线| 国产丶欧美丶日本不卡视频| 亚洲色图14p| 中文字幕日韩一区| 国产精品成人aaaa在线| 91久久精品一区二区| 国产视频第一页| 日韩精品一区二区三区第95| 香蕉视频网站在线观看| 午夜伦理精品一区| 久久麻豆视频| 久久伊人一区二区| 亚洲不卡av不卡一区二区| 男人日女人bb视频| 国内不卡的二区三区中文字幕| 好男人香蕉影院| 亚洲欧洲精品一区二区三区不卡 | 99综合精品| 色综合天天色综合| 成人av一区二区三区| 黄色精品视频在线观看| 欧美视频在线视频| 国产黄色大片网站| 一本一道久久a久久精品逆3p | 国产精品成人播放| 视频一区中文字幕精品| 亚洲国产综合自拍| 亚洲一区二区成人| 国产精品欧美性爱| 国产精品第13页| 五月天激情四射| 精品国产sm最大网站| 日本中文字幕视频在线| 欧美一区二区视频97| 日本一区二区三区视频在线看| 日韩av电影免费播放| 亚洲免费激情| 性xxxxxxxxx| 中文字幕人成不卡一区| 波多野结衣啪啪| 亚洲国产一区二区三区四区| 18视频在线观看| 91精品视频大全| 成人精品亚洲| 最近免费中文字幕中文高清百度| av在线播放一区二区三区| 妺妺窝人体色www婷婷| 91精品国产欧美一区二区| 午夜毛片在线| 国产精品入口夜色视频大尺度| 中文字幕亚洲影视| 99热在线这里只有精品| 99免费精品视频| 国产精品99re| 精品国产乱码久久久久久闺蜜| 二区三区在线观看| 国产在线999| 国产国产精品| 99精品视频国产| 亚洲人123区| 国产精品无码天天爽视频| 中文字幕在线看视频国产欧美| 成人国产精品一区二区免费麻豆| 日本在线成人一区二区| 日本午夜精品视频在线观看| 国产毛片久久久久久久| 欧美性黄网官网| 精品美女视频在线观看免费软件 | www.好吊操| 国产成人在线观看免费网站| 丁香花五月激情| 精品久久久久久最新网址| 狂野欧美性猛交xxxxx视频| 国产精品一区二区a| 国产亚洲精品久久久久婷婷瑜伽| av直播在线观看| 色婷婷亚洲一区二区三区| 国产午夜在线观看| 国产精品一区二区三区毛片淫片| 欧美中文字幕一区二区| 欧美午夜精品理论片| 亚洲欧美日韩电影| 高潮一区二区三区乱码| 2020国产精品视频| 欧美偷拍自拍| 中文字幕第三区| 亚洲v精品v日韩v欧美v专区| 网站黄在线观看| 国产精品成人av性教育| 亚洲成av人片一区二区密柚| av不卡中文字幕| 福利微拍一区二区| 在线毛片网站| 成人黄色在线免费观看| 午夜在线精品偷拍| 国产精品酒店视频| 欧美成人一区二区三区片免费 | 一本一道久久综合狠狠老| 少妇极品熟妇人妻无码| 精品久久久在线观看| 成人亚洲综合天堂| 99国产视频在线| 久久一二三区| 久久久久久久麻豆| 亚洲国产日韩欧美在线图片| 亚洲爱爱视频| 国产乱子伦精品视频| 久久久综合激的五月天| 亚洲综合免费视频| 午夜精品久久久久久久白皮肤| 欧美色网址大全| avtt中文字幕| 在线区一区二视频| 亚洲小说区图片| 日本在线成人一区二区| 成人小视频在线观看| 国产精品51麻豆cm传媒| 韩国v欧美v日本v亚洲| 婷婷久久一区| 欧美黄色一级生活片| 亚洲国产成人精品久久| 伊人久久一区|