日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

利用Java搭建個簡單的Netty通信實例教程

瀏覽:203日期:2022-09-01 15:08:10

前言

看過dubbo源碼的同學應該都清楚,使用dubbo協議的底層通信是使用的netty進行交互,而最近看了dubbo的Netty部分后,自己寫了個簡單的Netty通信例子。

準備

工程截圖

利用Java搭建個簡單的Netty通信實例教程

模塊詳解

rpc-common

rpc-common作為各個模塊都需使用的模塊,工程中出現的是一些通信時請求的參數以及返回的參數,還有一些序列化的工具。

rpc-client

rpc-client中目前只是單單的一個NettyClient啟動類。

rpc-server

rpc-client中目前也只是單單的一個NettyServer服務啟動類。

需要的依賴

目前所有的依賴項都出現在 rpc-common 下的 pom.xml中。

<dependencies> <!-- Netty --> <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.10.Final</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.25</version> </dependency> <!-- Protostuff --> <dependency> <groupId>com.dyuproject.protostuff</groupId> <artifactId>protostuff-core</artifactId> <version>1.0.9</version> </dependency> <dependency> <groupId>com.dyuproject.protostuff</groupId> <artifactId>protostuff-runtime</artifactId> <version>1.0.9</version> </dependency> <!-- Objenesis --> <dependency> <groupId>org.objenesis</groupId> <artifactId>objenesis</artifactId> <version>2.1</version> </dependency> <!-- fastjson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.38</version> </dependency></dependencies>

實現

首先我們在common中先定義本次的Request和Response的基類對象。

public class Request { private String requestId; private Object parameter; public String getRequestId() { return requestId; } public void setRequestId(String requestId) { this.requestId = requestId; } public Object getParameter() { return parameter; } public void setParameter(Object parameter) { this.parameter = parameter; }}public class Response { private String requestId; private Object result; public String getRequestId() { return requestId; } public void setRequestId(String requestId) { this.requestId = requestId; } public Object getResult() { return result; } public void setResult(Object result) { this.result = result; }}

使用fastJson進行本次序列化

Netty對象的序列化轉換很好懂, ByteToMessageDecoder 和 MessageToByteEncoder 分別只要繼承它們,重寫方法后,獲取到Object和Byte,各自轉換就OK。

不過如果是有要用到生產上的同學,建議不要使用 fastJson,因為它的漏洞補丁真的是太多了,可以使用google的 protostuff。

public class RpcDecoder extends ByteToMessageDecoder { // 目標對象類型進行解碼 private Class<?> target; public RpcDecoder(Class target) { this.target = target; } @Override protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception { if (in.readableBytes() < 4) { // 不夠長度丟棄 return; } in.markReaderIndex(); // 標記一下當前的readIndex的位置 int dataLength = in.readInt(); // 讀取傳送過來的消息的長度。ByteBuf 的readInt()方法會讓他的readIndex增加4 if (in.readableBytes() < dataLength) { // 讀到的消息體長度如果小于我們傳送過來的消息長度,則resetReaderIndex. 這個配合markReaderIndex使用的。把readIndex重置到mark的地方 in.resetReaderIndex(); return; } byte[] data = new byte[dataLength]; in.readBytes(data); Object obj = JSON.parseObject(data, target); // 將byte數據轉化為我們需要的對象 out.add(obj); }}public class RpcEncoder extends MessageToByteEncoder { //目標對象類型進行編碼 private Class<?> target; public RpcEncoder(Class target) { this.target = target; } @Override protected void encode(ChannelHandlerContext ctx, Object msg, ByteBuf out) throws Exception { if (target.isInstance(msg)) { byte[] data = JSON.toJSONBytes(msg); // 使用fastJson將對象轉換為byte out.writeInt(data.length); // 先將消息長度寫入,也就是消息頭 out.writeBytes(data); // 消息體中包含我們要發送的數據 } }}

NetyServer

public class NettyServerHandler extends ChannelInboundHandlerAdapter { @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { Request request = (Request) msg; System.out.println('Client Data:' + JSON.toJSONString(request)); Response response = new Response(); response.setRequestId(request.getRequestId()); response.setResult('Hello Client !'); // client接收到信息后主動關閉掉連接 ctx.writeAndFlush(response).addListener(ChannelFutureListener.CLOSE); } @Override public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { ctx.flush(); } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { ctx.close(); }}public class NettyServer { private static final Logger logger = LoggerFactory.getLogger(NettyServer.class); private String ip; private int port; public NettyServer(String ip, int port) { this.ip = ip; this.port = port; } public void server() throws Exception { EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); try { final ServerBootstrap serverBootstrap = new ServerBootstrap(); serverBootstrap.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) .option(ChannelOption.SO_BACKLOG, 1024) .option(ChannelOption.SO_SNDBUF, 32 * 1024) .option(ChannelOption.SO_RCVBUF, 32 * 1024) .option(ChannelOption.SO_KEEPALIVE, true) .childHandler(new ChannelInitializer<SocketChannel>() { protected void initChannel(SocketChannel socketChannel) throws Exception { socketChannel.pipeline().addLast(new RpcDecoder(Request.class)) .addLast(new RpcEncoder(Response.class)) .addLast(new NettyServerHandler()); } }); serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true); // 開啟長連接 ChannelFuture future = serverBootstrap.bind(ip, port).sync();// if (future.isSuccess()) {////new Register().register('/yanzhenyidai/com.yanzhenyidai.server', ip + ':' + port);// } future.channel().closeFuture().sync(); } finally { bossGroup.shutdownGracefully(); workerGroup.shutdownGracefully(); } } public static void main(String[] args) throws Exception { new NettyServer('127.0.0.1', 20000).server(); }}

關鍵名詞:

EventLoopGroup workerGroup bossGroup Server端的EventLoopGroup分為兩個,一般workerGroup作為處理請求,bossGroup作為接收請求。 ChannelOption SO_BACKLOG SO_SNDBUF SO_RCVBUF SO_KEEPALIVE 以上四個常量作為TCP連接中的屬性。 ctx.writeAndFlush(response).addListener(ChannelFutureListener.CLOSE);

NettyServerHandler中出現的 ChannelFutureListener.CLOSE ,作為Server端主動關閉與Client端的通信,如果沒有主動Close,那么NettyClient將會一直處于阻塞狀態,得不到NettyServer的返回信息。

NettyClient

public class NettyClient extends SimpleChannelInboundHandler<Response> { private final String ip; private final int port; private Response response; public NettyClient(String ip, int port) { this.ip = ip; this.port = port; } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { ctx.close(); } @Override protected void channelRead0(ChannelHandlerContext channelHandlerContext, Response response) throws Exception { this.response = response; } public Response client(Request request) throws Exception { EventLoopGroup group = new NioEventLoopGroup(); try { // 創建并初始化 Netty 客戶端 Bootstrap 對象 Bootstrap bootstrap = new Bootstrap(); bootstrap.group(group); bootstrap.channel(NioSocketChannel.class); bootstrap.handler(new ChannelInitializer<SocketChannel>() {@Overridepublic void initChannel(SocketChannel channel) throws Exception { ChannelPipeline pipeline = channel.pipeline(); pipeline.addLast(new RpcDecoder(Response.class)); pipeline.addLast(new RpcEncoder(Request.class)); pipeline.addLast(NettyClient.this);} }); bootstrap.option(ChannelOption.TCP_NODELAY, true);// String[] discover = new Discover().discover('/yanzhenyidai/com.yanzhenyidai.server').split(':'); // 連接 RPC 服務器 ChannelFuture future = bootstrap.connect(ip, port).sync(); // 寫入 RPC 請求數據并關閉連接 Channel channel = future.channel(); channel.writeAndFlush(request).sync(); channel.closeFuture().sync(); return response; } finally { group.shutdownGracefully(); } } public static void main(String[] args) throws Exception { Request request = new Request(); request.setRequestId(UUID.randomUUID().toString()); request.setParameter('Hello Server !'); System.out.println(JSON.toJSONString(new NettyClient('127.0.0.1', 30000).client(request))); }}

測試

如果以上所有內容都準備就緒,那么就可以進行調試了。

啟動順序,先啟動NettyServer,再啟動NettyClient。

總結

記得剛出來工作時,有工作很多年的同事問我了不了解Netty,當時工作太短,直說聽過Putty,現在回想起來真的挺丟人的,哈哈。😋

Netty作為通信框架,如果你了解TCP,而且項目中有類似傳輸信息的需求,又不想集成HTTP或者Socket,那么Netty真的挺實用的。

參考資料:

Dubbo-Netty Netty.io

本項目Github地址:Netty-RPC

到此這篇關于利用Java搭建個簡單的Netty通信的文章就介紹到這了,更多相關Java搭建Netty通信內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
免费福利视频一区二区三区| 欧美丰满日韩| 日韩亚洲在线| 欧洲激情综合| 日韩视频在线一区二区三区 | 欧美一区=区三区| 国产精品亚洲产品| 国产精品毛片一区二区在线看| 日韩中文首页| 亚洲二区三区不卡| 亚洲综合激情在线| 日韩精品三区四区| 久久精品国产一区二区| 午夜精品成人av| 亚洲激情欧美| 日本欧美一区二区| 久久久久亚洲精品中文字幕| 亚洲综合在线电影| 怡红院精品视频在线观看极品| 亚洲毛片在线免费| 九九九精品视频| 久久国产电影| 青草国产精品| 日韩高清中文字幕一区二区| 免费精品视频在线| 精品欧美日韩精品| 欧美日韩国产在线观看网站| 日韩国产一二三区| 日韩欧美一区二区三区免费看| 亚洲欧美日本国产专区一区| 欧美亚洲人成在线| 欧美日韩一区二区三区视频播放| 热久久免费视频| 麻豆国产91在线播放| 亚洲电影有码| 日韩激情av在线| 亚洲综合在线电影| 青青国产精品| 欧美高清一区| 国产精品videosex极品| 免费视频国产一区| 久久av影视| 国产亚洲综合精品| 国产精品原创| 日韩一区二区三区精品| 欧美一区三区| 国产一区二区三区四区五区| 蜜臀av一区二区在线免费观看| 久久精品国产久精国产| 亚洲一区二区免费看| 久久久免费人体| 亚洲一区二区三区中文字幕在线观看| 久久精品一区二区三区中文字幕| 久久亚洲一区| 蜜臀国产一区| 欧美精品1区| 日韩精品高清不卡| 在线亚洲国产精品网站| 97精品97| 国产精品成人自拍| 亚洲精品看片| 激情婷婷综合| av资源中文在线天堂| 伊人www22综合色| 久久国产主播| 亚洲资源网站| 国产日韩综合| 久久国产日韩| 日韩专区精品| 中文在线资源| 国产一区二区三区四区| 欧美午夜三级| 日本综合视频| 在线精品视频一区| 日韩中文视频| 日韩理论视频| 精品国产一区二区三区性色av| 日韩va欧美va亚洲va久久| 国产视频久久| 国模 一区 二区 三区| 国产夫妻在线| 国产高潮在线| 高清一区二区| 国产一区二区三区四区大秀| 欧美激情在线精品一区二区三区| 国产日韩欧美一区| 国产欧美三级| 国产精品99久久免费| 欧美精品国产白浆久久久久| 午夜久久av| 日韩一区二区三免费高清在线观看 | 国产成人精品免费视| 国产精品一区二区三区四区在线观看 | 99国产精品99久久久久久粉嫩| 日韩久久电影| 日韩一区欧美| 久久精品国产亚洲夜色av网站| 久久久精品午夜少妇| 国精品产品一区| 久久精品国产999大香线蕉| 精品国产午夜肉伦伦影院| 精品亚洲成人| 亚洲不卡系列| 欧美天堂亚洲电影院在线观看| 在线国产一区二区| 免费在线看一区| 91麻豆精品| 精品高清久久| 九色porny丨国产首页在线| 偷拍精品精品一区二区三区| 欧美jjzz| 日本中文字幕视频一区| 国产免费久久| 日本国产欧美| 麻豆精品一区二区综合av| 青青草91视频| 麻豆高清免费国产一区| 日韩精品dvd| 91久久国产| 亚洲日本在线观看视频| 国产视频一区二| 国产成人久久精品一区二区三区| 日韩欧美精品综合| 亚洲免费影院| 美女国产一区二区三区| 久久精品国产大片免费观看| 中文字幕一区二区精品区| 久久精品亚洲一区二区| 天堂网av成人| 亚洲另类黄色| 精品国产不卡一区二区| 婷婷久久一区| 日本不卡的三区四区五区| 你懂的国产精品| 欧美成人久久| 日韩av网站在线观看| 91亚洲人成网污www| 午夜国产一区二区| 日韩高清电影一区| 九九精品调教| 亚洲精品欧洲| 免费污视频在线一区| 人人精品人人爱| 国产精久久久| 欧美日韩精品免费观看视完整 | 日韩一区二区三区在线看| 国产在线不卡一区二区三区| 欧美va天堂在线| 国产精品一区二区三区美女| 久久精品青草| 国产精品最新自拍| 久久网站免费观看| 国产欧美成人| 国产在线欧美| 欧美精品97| 免费日韩一区二区| 国产极品一区| av不卡在线| 国产成人精品999在线观看| 日韩中文字幕91| 日韩大片在线观看| 日韩1区2区日韩1区2区| 久久精品观看| 国产精品美女久久久久久不卡| 香蕉精品视频在线观看| 国产精品4hu.www| 蜜桃久久久久久久| 亚洲永久av| 国产精品亚洲欧美一级在线| 亚洲一区网站| 四虎影视精品| 日韩欧美四区| 国产精品91一区二区三区| 福利视频一区| 国产亚洲一区二区三区啪| 国产精品7m凸凹视频分类| 精品久久电影| 国产人成精品一区二区三| 亚洲专区欧美专区| 日韩欧美精品| 久久精品一区二区三区中文字幕| 香蕉久久一区| 亚洲在线观看| 激情综合在线| 97精品国产| 乱一区二区av| 日韩在线黄色| 亚洲综合日本| 91国语精品自产拍| 久久久久久久久99精品大| 精品美女在线视频| 国产精品亚洲一区二区在线观看| 亚洲欧美久久精品| 国产精品视区| 999久久久精品国产| 黄在线观看免费网站ktv| 国产精品jk白丝蜜臀av小说| 国产女人18毛片水真多18精品| 亚洲啊v在线免费视频| 亚洲精品麻豆|