摘要:寫(xiě)個(gè)簡(jiǎn)單點(diǎn),比較小白的文檔,言語(yǔ)比較接地氣是什么的高層封裝,很難寫(xiě),所以有了,方便異步的操作的主要代碼片段按照代碼順序解釋如下事件循環(huán)隊(duì)列,用來(lái)接受或發(fā)送事件。
寫(xiě)個(gè)簡(jiǎn)單點(diǎn),比較小白的文檔,言語(yǔ)比較接地氣
Netty是什么?
NIO的高層封裝,NIO很難寫(xiě),所以有了Netty,方便異步的操作
service的主要代碼片段
public void run() throws Exception { EventLoopGroup bossGroup = new NioEventLoopGroup(); // (1) EventLoopGroup workerGroup = new NioEventLoopGroup(); try { ServerBootstrap b = new ServerBootstrap(); // (2) b.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) // (3) .childHandler(new ChannelInitializer() { // (4) @Override public void initChannel(SocketChannel ch) throws Exception { ch.pipeline().addLast(new DiscardServerHandler()); } }) .option(ChannelOption.SO_BACKLOG, 128) // (5) .childOption(ChannelOption.SO_KEEPALIVE, true); // (6) // Bind and start to accept incoming connections. ChannelFuture f = b.bind(port).sync(); // (7) // Wait until the server socket is closed. // In this example, this does not happen, but you can do that to gracefully // shut down your server. f.channel().closeFuture().sync(); } finally { workerGroup.shutdownGracefully(); bossGroup.shutdownGracefully(); } }
按照代碼順序解釋如下
(1) EventLoopGroup bossGroup = new NioEventLoopGroup();
事件循環(huán)隊(duì)列,用來(lái)接受或發(fā)送事件。大家可以把他想象成郵局,消息都要先到郵局,然后再分發(fā)出去,郵局維護(hù)了一個(gè)循環(huán)隊(duì)列,用來(lái)不斷的收信和發(fā)信。
(2)ServerBootstrap b = new ServerBootstrap();
啟動(dòng)服務(wù)
(3) b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class)
開(kāi)啟了一個(gè)通道,這個(gè)通道是用來(lái)接受連接請(qǐng)求的,管道大家都知道吧,IO里也有,NIO中也有,一切Java中到處都是管道
(4).childHandler(new ChannelInitializer
這個(gè)handler是用來(lái)表示響應(yīng)什么樣的事件的,比如我們這里DiscardServerHandler,隨著程序的復(fù)雜,你會(huì)加上更多的handle,handler是具體干事的人
(5).option(ChannelOption.SO_BACKLOG, 128)
channel的配置參數(shù),具體可以查手冊(cè)
(6).childOption(ChannelOption.SO_KEEPALIVE, true);
option()是 NioServerSocketChannel的配置,childOption()是被parent ServerChannel接受的channel,這里就指的是NioServerSocketChannel
(7)ChannelFuture f = b.bind(port).sync();
綁定端口并開(kāi)始
再看看我們主要進(jìn)行事件處理的handle
public class DiscardServerHandler extends ChannelHandlerAdapter { // (1) @Override public void channelRead(ChannelHandlerContext ctx, Object msg) { // (2) // Discard the received data silently. ((ByteBuf) msg).release(); // (3) } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { // (4) // Close the connection when an exception is raised. cause.printStackTrace(); ctx.close(); } }
(1)DiscardServerHandler extends ChannelHandlerAdapter
表示:俺是具體干事的人
(2)我們overrider了 channelRead(),用來(lái)讀取接受到的信息
(3)異常處理,懂的...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/69978.html
摘要:請(qǐng)回復(fù)這個(gè)帖子并注明組織個(gè)人信息來(lái)申請(qǐng)加入。權(quán)限分配靈活,能者居之。數(shù)量超過(guò)個(gè),在所有組織中排名前。網(wǎng)站日超過(guò),排名的峰值為。導(dǎo)航歸檔社區(qū)自媒體平臺(tái)微博知乎專(zhuān)欄公眾號(hào)博客園簡(jiǎn)書(shū)合作侵權(quán),請(qǐng)聯(lián)系請(qǐng)抄送一份到贊助我們 Special Sponsors showImg(https://segmentfault.com/img/remote/1460000018907426?w=1760&h=...
摘要:的選擇器允許單個(gè)線程監(jiān)視多個(gè)輸入通道。一旦執(zhí)行的線程已經(jīng)超過(guò)讀取代碼中的某個(gè)數(shù)據(jù)片段,該線程就不會(huì)在數(shù)據(jù)中向后移動(dòng)通常不會(huì)。 1、引言 很多初涉網(wǎng)絡(luò)編程的程序員,在研究Java NIO(即異步IO)和經(jīng)典IO(也就是常說(shuō)的阻塞式IO)的API時(shí),很快就會(huì)發(fā)現(xiàn)一個(gè)問(wèn)題:我什么時(shí)候應(yīng)該使用經(jīng)典IO,什么時(shí)候應(yīng)該使用NIO? 在本文中,將嘗試用簡(jiǎn)明扼要的文字,闡明Java NIO和經(jīng)典IO之...
時(shí)間:2018年04月11日星期三 說(shuō)明:本文部分內(nèi)容均來(lái)自慕課網(wǎng)。@慕課網(wǎng):https://www.imooc.com 教學(xué)源碼:https://github.com/zccodere/s... 學(xué)習(xí)源碼:https://github.com/zccodere/s... 第一章:課程介紹 1-1 課程介紹 什么是Netty 高性能、事件驅(qū)動(dòng)、異步非阻塞的IO Java開(kāi)源框架 基于NIO的客戶...
閱讀 2654·2023-04-25 20:50
閱讀 4135·2023-04-25 18:45
閱讀 2281·2021-11-17 17:00
閱讀 3392·2021-10-08 10:05
閱讀 3144·2019-08-30 15:55
閱讀 3585·2019-08-30 15:44
閱讀 2408·2019-08-29 13:51
閱讀 1177·2019-08-29 12:47