標籤:substr 指定 tty exce stat void strong bst res
Netty3 原始碼分析 - NIO server綁定過程分析
一個架構封裝的越好,越利於我們高速的coding。可是卻掩蓋了非常多的細節和原理。可是原始碼可以揭示一切。
伺服器端代碼在指定好ChannelFactory。設定好選項。而後Bootstrap.bind操作就會開啟server。接受對端的串連。
所以有必要對這後面的過程分析清楚,是關鍵流程。先是構建一個預設的Pipeline,為我們接下來要建立的監聽通道服務。這個Pipeline裡面會增加一個Binder的上行事件處理器。接下來建立了至關中的NioServerSocketChannel,在構造的過程中,調用了NIO中ServerSocketChannel的open方法開啟通訊端,設為非堵塞,然後會觸發一個OPEN的上行 ChannelStateEvent(為後文買下伏筆),接下來Bootstrap就會等待著成功的訊號。還有一方面,在將Binder這個Handler增加bossPipeline的時候,它就已經準備好運轉了,在收到一個OPEN事件後,就會設定通訊端選項,運行真正的通訊端綁定,而後Future.setSuccess就會讓前面的bind方法成功返回,開始運轉。代碼例如以下:public void channelOpen( ChannelHandlerContext ctx, ChannelStateEvent evt) {
try { // 內部類能夠訪問外部類的方法 。如 getPipelineFactory()。 evt.getChannel().getConfig().setPipelineFactory(getPipelineFactory());
// Split options into two categories: parent and child. Map<String, Object> allOptions = getOptions(); Map<String, Object> parentOptions = new HashMap<String, Object>(); for (Entry<String, Object> e: allOptions.entrySet()) { if (e.getKey().startsWith( "child.")) { childOptions.put( e.getKey().substring(6), e.getValue()); } else if (!"pipelineFactory" .equals(e.getKey())) { parentOptions.put(e.getKey(), e.getValue()); } }
// Apply parent options. evt.getChannel().getConfig().setOptions(parentOptions); } finally { ctx.sendUpstream(evt); }
//============ 真正的綁定通訊端 ======= evt.getChannel().bind( localAddress).addListener( new ChannelFutureListener() { public void operationComplete(ChannelFuture future) throws Exception { if (future.isSuccess()) { // 這裡觸發了 bind的成功 bindFuture.setSuccess(); } else { bindFuture.setFailure(future.getCause()); } } }); }
更具體的理解看Netty3 原始碼凝視,見Github。
Netty3 原始碼分析 - NIO server綁定過程分析