日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

netty 客户端断开 异常处理_netty案例,netty4.1基础入门篇八《NettyClient半包粘包处理》发数据方式》...

發布時間:2023/12/15 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 netty 客户端断开 异常处理_netty案例,netty4.1基础入门篇八《NettyClient半包粘包处理》发数据方式》... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
小傅哥 | https://bugstack.cn 沉淀、分享、成長,讓自己和他人都能有所收獲。專注于原創專題案例編寫,目前已完成的專題有;Netty4.x實戰專題案例、用Java實現JVM、基于JavaAgent的全鏈路監控、手寫RPC框架、架構設計專題案例、源碼分析等。你用劍 、我用刀 ,好的代碼都很燒,望你不吝出招!

一、前言介紹

Netty開發中,客戶端與服務端需要保持同樣的;半包粘包處理,編碼解碼處理、收發數據方式,這樣才能保證數據通信正常。在前面NettyServer的章節中我們也同樣處理了;半包粘包、編碼解碼等,為此在本章節我們可以把這些知識模塊開發到NettyClient中。本章節涉及到的知識點有;LineBasedFrameDecoder、StringDecoder、StringEncoder、ChannelInboundHandlerAdapter等。

二、開發環境

  • jdk1.8【jdk1.7以下只能部分支持netty】
  • Netty4.1.36.Final【netty3.x 4.x 5每次的變化較大,接口類名也隨著變化】
  • telnet 測試【可以現在你的win7機器上測試這個命令,用于鏈接到服務端的測試命令】
  • 三、代碼示例

    itstack-demo-netty-1-08 └── src├── main│ └── java│ └── org.itstack.demo.netty.client│ ├── MyChannelInitializer.java│ ├── MyClientHandler.java│ └── NettyClient.java└── test└── java└── org.itstack.demo.netty.test└── ApiTest.javaMyChannelInitializer.java/*** 蟲洞棧:https://bugstack.cn* 公眾號:bugstack蟲洞棧 {獲取學習源碼}* Create by fuzhengwei on 2019*/ public class MyChannelInitializer extends ChannelInitializer<SocketChannel> {@Overrideprotected void initChannel(SocketChannel channel) throws Exception {// 基于換行符號channel.pipeline().addLast(new LineBasedFrameDecoder(1024));// 解碼轉String,注意調整自己的編碼格式GBK、UTF-8channel.pipeline().addLast(new StringDecoder(Charset.forName("GBK")));// 解碼轉String,注意調整自己的編碼格式GBK、UTF-8channel.pipeline().addLast(new StringEncoder(Charset.forName("GBK")));// 在管道中添加我們自己的接收數據實現方法channel.pipeline().addLast(new MyClientHandler());}}MyClientHandler.java/*** 蟲洞棧:https://bugstack.cn* 公眾號:bugstack蟲洞棧 {獲取學習源碼}* Create by fuzhengwei on 2019*/ public class MyClientHandler extends ChannelInboundHandlerAdapter {/*** 當客戶端主動鏈接服務端的鏈接后,這個通道就是活躍的了。也就是客戶端與服務端建立了通信通道并且可以傳輸數據*/@Overridepublic void channelActive(ChannelHandlerContext ctx) throws Exception {SocketChannel channel = (SocketChannel) ctx.channel();System.out.println("鏈接報告開始");System.out.println("鏈接報告信息:本客戶端鏈接到服務端。channelId:" + channel.id());System.out.println("鏈接報告IP:" + channel.localAddress().getHostString());System.out.println("鏈接報告Port:" + channel.localAddress().getPort());System.out.println("鏈接報告完畢");//通知客戶端鏈接建立成功String str = "通知服務端鏈接建立成功" + " " + new Date() + " " + channel.localAddress().getHostString() + "rn";ctx.writeAndFlush(str);}/*** 當客戶端主動斷開服務端的鏈接后,這個通道就是不活躍的。也就是說客戶端與服務端的關閉了通信通道并且不可以傳輸數據*/@Overridepublic void channelInactive(ChannelHandlerContext ctx) throws Exception {System.out.println("斷開鏈接" + ctx.channel().localAddress().toString());}@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {//接收msg消息{與上一章節相比,此處已經不需要自己進行解碼}System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + " 接收到消息:" + msg);//通知客戶端鏈消息發送成功String str = "客戶端收到:" + new Date() + " " + msg + "rn";ctx.writeAndFlush(str);}/*** 抓住異常,當發生異常的時候,可以做一些相應的處理,比如打印日志、關閉鏈接*/@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {ctx.close();System.out.println("異常信息:rn" + cause.getMessage());}}NettyClient.java/*** 蟲洞棧:https://bugstack.cn* 公眾號:bugstack蟲洞棧 {獲取學習源碼}* Create by fuzhengwei on 2019*/ public class NettyClient {public static void main(String[] args) {new NettyClient().connect("127.0.0.1", 7397);}private void connect(String inetHost, int inetPort) {EventLoopGroup workerGroup = new NioEventLoopGroup();try {Bootstrap b = new Bootstrap();b.group(workerGroup);b.channel(NioSocketChannel.class);b.option(ChannelOption.AUTO_READ, true);b.handler(new MyChannelInitializer());ChannelFuture f = b.connect(inetHost, inetPort).sync();System.out.println("itstack-demo-netty client start done. {關注公眾號:bugstack蟲洞棧,獲取源碼}");f.channel().closeFuture().sync();} catch (InterruptedException e) {e.printStackTrace();} finally {workerGroup.shutdownGracefully();}}}

    四、測試結果

    啟動模擬器NetAssist 設置TCP Server

    啟動客戶端NettyClient

    執行結果/*** 蟲洞棧:https://bugstack.cn* 公眾號:bugstack蟲洞棧 {獲取學習源碼}* Create by fuzhengwei on 2019*/ public class NettyClient {public static void main(String[] args) {new NettyClient().connect("127.0.0.1", 7397);}private void connect(String inetHost, int inetPort) {EventLoopGroup workerGroup = new NioEventLoopGroup();try {Bootstrap b = new Bootstrap();b.group(workerGroup);b.channel(NioSocketChannel.class);b.option(ChannelOption.AUTO_READ, true);b.handler(new MyChannelInitializer());ChannelFuture f = b.connect(inetHost, inetPort).sync();System.out.println("itstack-demo-netty client start done. {關注公眾號:bugstack蟲洞棧,獲取源碼}");f.channel().closeFuture().sync();} catch (InterruptedException e) {e.printStackTrace();} finally {workerGroup.shutdownGracefully();}}}

    總結

    以上是生活随笔為你收集整理的netty 客户端断开 异常处理_netty案例,netty4.1基础入门篇八《NettyClient半包粘包处理》发数据方式》...的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。