八、Netty入門服務端代碼

2020-09-24 程序猿的花果山

導論

前面幾篇文章我們分別對 、 、 、 、 、 、 等幾個緯度對JAVAIO和NIO體系做了詳細介紹,並由簡到深的根據IO體系的升級過程做了系統分析。

前文中的第 、文章我們已經使用Selector自己實現了Netty框架中的單線程模型、主從模型。如果能深入理解以上兩篇文章,那麼後續對於Netty的學習和理解Netty的Reactor會非常簡單。今天我們先通過入門的角度從Idea中導入Netty包,並且使用Netty構建一個可用於接受數據的服務端。

IDEA的maven項目的netty包的導入(其他jar同)

在這之前要有搭建好maven的環境,如何搭建maven環境請自行百度。

1.

2.選擇Modules


3.



4.等待一會選擇,Download to可以不用勾選,下載的jar會放在本地的jar倉庫裡,如果勾選了則會在該項目下創建一個lib文件,並且將包放裡面。

5.


6.選擇一個netty包,點擊ok,接下來選擇即可。
最後選擇


7.即可完成。
在該項目的pom.xml裡加入netty依賴。

<!-- netty --> <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>5.0.0.Alpha2</version> </dependency>

netty入門服務端代碼

import io.netty.bootstrap.ServerBootstrap;import io.netty.channel.*;import io.netty.channel.nio.NioEventLoopGroup;import io.netty.channel.socket.nio.NioServerSocketChannel;import io.netty.channel.socket.nio.NioSocketChannel;/** * Created by Bruce on 2020/9/18 * 使用 NettyIO實現多路復用器 **/public class NettyIO {    public static void main(String[] args) throws InterruptedException {        /**         * //單線程模型---netty單線程模型---即接受客戶端請求連接也負責處理客戶端的數據         * netty單線程模型---寫法         * NioEventLoopGroup boss = new NioEventLoopGroup(1);         *         ServerBootstrap serverBootstrap = new ServerBootstrap();         *         serverBootstrap.group(boss,boss)         *                 .channel(NioServerSocketChannel.class)         *                 .childHandler(new MyImbound());         *         *         * //混合模型---netty混合模型---組內有一個boss即接受客戶端請求連接也負責處理客戶端的數據,其他線程只負責處理客戶端的數據         * netty混合模型---寫法         * NioEventLoopGroup boss = new NioEventLoopGroup(4);         *         ServerBootstrap serverBootstrap = new ServerBootstrap();         *         serverBootstrap.group(boss,boss)         *                 .channel(NioServerSocketChannel.class)         *                 .childHandler(new MyImbound());         *         * //主備模型---netty主備模型---boss 只負責接口客戶端的連接請求 worker負責         *         * -----如果這裡把 boss的參數改成  2,那麼猜一下系統中會有幾個線程?         * 用JDK自帶的jvisualvm看一下。         *         * NioEventLoopGroup boss = new NioEventLoopGroup(1);         *         NioEventLoopGroup worker = new NioEventLoopGroup(3);         *         ServerBootstrap serverBootstrap = new ServerBootstrap();         *         serverBootstrap.group(boss,worker)         *                 .channel(NioServerSocketChannel.class)         *                 .childHandler(new MyImbound());         *         */        NioEventLoopGroup boss = new NioEventLoopGroup(1);        NioEventLoopGroup worker = new NioEventLoopGroup(3);        ServerBootstrap serverBootstrap = new ServerBootstrap();        serverBootstrap.group(boss,worker)                .channel(NioServerSocketChannel.class)                .childHandler(new ChannelInitializer<NioSocketChannel>() {                    @Override                    protected void initChannel(NioSocketChannel nioSocketChannel) throws Exception {                        ChannelPipeline p = nioSocketChannel.pipeline();                        p.addLast(new MyImbound());                    }                });        ChannelFuture future = serverBootstrap.bind(8080).sync();        future.channel().closeFuture().sync();    }}class MyImbound extends ChannelHandlerAdapter{    @Override    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {//        super.channelRead(ctx, msg);        ctx.write(msg);    }    @Override    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {//        super.channelReadComplete(ctx);        ctx.flush();    }}

數據列印:

在linux環境或者windows環境下使用nc命令連結服務端,查看服務端列印過程。

具體linux系統或者windows系統如何安裝nc命令,請從網絡搜索或查看目錄文檔 『網絡IO涉及到的-linux指令.docx』。

1.nc客戶端1列印(Windows-nc命令列印)

C:\Users\Administrator>nc 127.0.0.1 8080111111111111

2.nc客戶端1列印(Windows-nc命令列印)

C:\Users\Administrator>nc 127.0.0.1 8080222222

往期文章連結


如需了解更多更詳細內容也可關注本人CSDN博客:不吃_花椒

如果需要後續其他系列文章請讚賞後關注私聊。



後續文章中的整體JavaIO體系文章概覽




相關焦點

  • 基於Netty的高性能RPC框架Nifty 服務端啟動全解析
    ThriftServiceProcessor:thrift服務處理器,服務端收到數據後,最終將由這個類來進行處理,可以理解為最核心的類了。ThriftServer: thrift伺服器,主要用來設置參。啟動服務,說具體點就是設置好netty的一些處理器等參數,然後啟動netty服務。
  • netty快速入門教程
    讓我們開始吧本章圍繞 Netty 的核心架構,通過簡單的示例帶你快速入門。當你讀完本章節,你馬上就可以用 Netty 寫出一個客戶端和伺服器。開始之前在開始之前我們先說明下開發環境,我們使用netty-4.1.30這個版本,jdk使用1.8及以上版本。
  • Netty學習-Netty 快速入門實例-TCP 服務
    </groupId> <artifactId>netty-all</artifactId> <version>4.1.22.Final</version> </dependency>碼代碼之前,首先看看我的目錄結構,有個心理準備,很簡單就幾個類O(∩_∩)
  • NIO框架入門(二):服務端基於MINA2的UDP雙向通信Demo演示
    本文將演示的是一個基於MINA2的UDP服務端和一個標準UDP客戶端(Java實現)雙向通信的完整例子。實際上,MINA2的官方代碼裡有完整的UDP通信Demo代碼,但Demo裡客戶端是需要依賴MINA2的客戶端庫的,而如果簡單地去掉MINA2的lib依賴,改為標準的Java UDP代碼,則服務端和客戶端的數據收發都會存在未知多餘字節等。
  • netty-socketio+vue實現服務端推送消息到前端
    這種時候需要服務端主動向用戶推送一些內容,一般有兩種做法:客戶端不斷的請求服務端以獲取最新數據(輪詢)服務端主動推送給客戶端(消息通知/推送)一般來講,第二種會更加優雅一些,並且減少了大量的請求消耗。市場上也有很多的消息推送技術,比如websocket、socketio、netty等。
  • 你不要和我說Netty快速入門會很難
    Netty快速入門實例-TCP服務1、實例要求:使用IDEA創建Netty項目;2、Netty伺服器在6668埠監聽,客戶端能發送消息給伺服器「hello,伺服器」;3、伺服器可以回復消息給客戶端「hello,客戶端」;4、目的:對Netty線程模型有一個初步認識,便於理解Netty模型理論;
  • Netty的使用:Client端
    最近寫了一個和c++server端按需通信的項目,自己記錄一下。它是Netty網絡通信的主體,由它負責同對端進行網絡通信、註冊和數據操作等功能。;import org.apache.commons.logging.LogFactory;import io.netty.bootstrap.Bootstrap;import io.netty.buffer.Unpooled;import io.netty.channel.Channel;import io.netty.channel.ChannelFuture;import io.netty.channel.ChannelInitializer
  • Netty拆包粘包和服務啟動流程分析,一文帶你掌握工作流程
    在基於流的傳輸中,即便客戶端發送獨立的數據包,作業系統也會將其轉換成一串字節隊列,而服務端一次讀取到的字節數又不確定。再加上網絡傳輸的快慢。服務端很難完整的接收到數據。常見的拆包粘包方法有三種1 服務端設置一次接收字節的長度。
  • 「網絡通信」Netty 入門實戰
    例如,您可能希望在關閉連接之前發送帶有錯誤代碼的響應消息。代碼如下:服務端publicclassTimeServerHandlerextendsChannelInboundHandlerAdapter{@OverridepublicvoidchannelActive(ChannelHandlerContext ctx)throws Exception { // [1]final ByteBuf time = ctx.alloc(
  • 程式設計師:利用Netty來寫一個簡單的聊天室、心跳檢測
    也就是說,Netty 是一個基於NIO的客戶、伺服器端編程框架,使用Netty 可以確保你快速和簡單的開發出一個網絡應用,例如實現了某種協議的客戶、服務端應用。Netty相當於簡化和流線化了網絡應用的編程開發過程,例如:基於TCP和UDP的socket服務開發。
  • Springboot 2.0 +protobuf + Netty 實戰
    關於SpringBoot 如何整合使用 Netty ,我將分為以下幾步進行分析與討論:構建Netty 服務端構建Netty 客戶端利用protobuf定義消息格式服務端空閒檢測客戶端發送心跳包與斷線重連PS: 我這裡為了簡單起見(主要是懶),將 Netty 服務端與客戶端放在了同一個SpringBoot工程裡,當然也可以將客戶端和服務端分開。
  • Netty從入門到禿頭:websocket
    --netty的依賴集合,都整合在一個依賴裡面了--> <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.6.Final</version>
  • 幾十行代碼基於Netty搭建一個 HTTP Server
    本文已經收錄進 : (Netty 從入門到實戰:手寫 HTTP Server+RPC 框架)。--netty--><dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.42.Final</version></dependency><!
  • 徹底搞懂 Netty 線程模型
    典型的應用有:阿里分布式服務框架 Dubbo 的 RPC 使用 Dubbo 協議進行通信,Dubbo 協議默認使用 Netty 作為基礎通信組件,用於實現各進程節點之間的內部通信;消息中間件Rocketmq底層也是用的Netty作為基礎通信組件。遊戲行業:無論是手遊服務端還是大型的網路遊戲,Java 語言都得到了越來越廣泛的應用。
  • 該試試Netty了
    代碼如下:package com.jcj.helloworld;import io.netty.buffer.ByteBuf;import io.netty.channel.ChannelHandler;import io.netty.channel.ChannelHandlerContext;import io.netty.channel.SimpleChannelInboundHandler
  • MqttWk 1.0.0-netty 發布,Java MQTT服務及消息代理
    MqttWk by netty基於 nutzboot + netty + redis + kafka 實現的MQTT服務broker(另有t-io版本分支,暫未發布)本項目代碼主要來源於
  • netty服務端啟動流程總結
    先看個流程圖服務端啟動做了哪些事情123456789101112131415161718總結1.啟動流程中做的事情還是 創建selector,channel,綁定埠,輪訓selector 其實和我們使用jdk nio編寫一個網絡編程是沒本質區別的,只不過是做了組件化 的封裝,擴展性更強2.netty
  • 超詳細Netty入門,看這篇就夠了
    <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.20.Final</version></dependency>
  • Netty實現高性能RPC伺服器優化篇之消息序列化
    先來看下,NettyRPC服務端的實現部分。首先是,Rpc服務端管道初始化(MessageRecvChannelInitializer),跟上一版本對比,主要引入了序列化消息對象(RpcSerializeProtocol),具體實現代碼如下:/** * @filename:MessageRecvChannelInitializer.java * * Newland Co. Ltd.
  • Dubbo源碼學習——從源碼看看dubbo對netty的使用
    本文分成兩大部分,一部分是dubbo服務端對netty的封裝,一部分是dubbo客戶端對netty的封裝,而每部分都分netty初始化和調用兩個階段,下面進入正題。到這裡我們可以知道, dubbo服務提供者中一個ip+埠對應一個nettyServer,所有的nettyServer統一放在一個ConcurrentHashMap中維護了起來 。但其實通常情況下,一個服務提供者的伺服器,只會暴露一個埠給dubbo用,故雖然用Map存起來,但一般只會有一個nettyServer。