前面幾篇文章我們分別對 、 、 、 、 、 、 等幾個緯度對JAVAIO和NIO體系做了詳細介紹,並由簡到深的根據IO體系的升級過程做了系統分析。
前文中的第 、文章我們已經使用Selector自己實現了Netty框架中的單線程模型、主從模型。如果能深入理解以上兩篇文章,那麼後續對於Netty的學習和理解Netty的Reactor會非常簡單。今天我們先通過入門的角度從Idea中導入Netty包,並且使用Netty構建一個可用於接受數據的服務端。
在這之前要有搭建好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>
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博客:不吃_花椒
如果需要後續其他系列文章請讚賞後關注私聊。