[weave message frame] [netty Source analysis]7 Unsafe Implementation Class NIOSOCKETCHANNELUNSAFE responsibility and implementation

Source: Internet
Author: User
Tags throwable
<span id="Label3"></p><p><p>Unsafe is the internal interface of the channel and is responsible for dealing with the underlying socket. It is not publicly available to developers from the writing and naming, until the final implementation of the Niosocketchannelunsafe is not disclosed.</p></p><pre><span style="color: #0000ff;"><span style="color: #0000ff;"></span> public</span> <span style="color: #0000ff;"><span style="color: #0000ff;">Interface</span></span>Channel<span style="color: #0000ff;"><span style="color: #0000ff;">extends</span></span>attributemap, channeloutboundinvoker, comparable<channel><span style="color: #000000;"><span style="color: #000000;"> { </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">Interface</span></span><span style="color: #000000;"><span style="color: #000000;">Unsafe {recvbytebufallocator.handle Recvbufallochandle (); SocketAddress localaddress (); SocketAddress remoteaddress (); </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">void</span></span><span style="color: #000000;"><span style="color: #000000;">Register (eventloop eventloop, channelpromise promise); </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">void</span></span><span style="color: #000000;"><span style="color: #000000;">bind (socketaddress localaddress, channelpromise promise); </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">void</span></span><span style="color: #000000;"><span style="color: #000000;">Connect (socketaddress remoteaddress, socketaddress localaddress, channelpromise promise); </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">void</span></span><span style="color: #000000;"><span style="color: #000000;">Disconnect (channelpromise promise); </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">void</span></span><span style="color: #000000;"><span style="color: #000000;">Close (channelpromise promise); </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">void</span></span><span style="color: #000000;"><span style="color: #000000;">closeforcibly (); </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">void</span></span><span style="color: #000000;"><span style="color: #000000;">deregister (channelpromise promise); </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">void</span></span><span style="color: #000000;"><span style="color: #000000;">BeginRead (); </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">void</span></span><span style="color: #000000;"><span style="color: #000000;">Write (Object msg, channelpromise promise); </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">void</span></span><span style="color: #000000;"><span style="color: #000000;">Flush (); Channelpromise voidpromise (); Channeloutboundbuffer Outboundbuffer (); } </span></span><span style="color: #0000ff;"><span style="color: #0000ff;"></span> public</span> <span style="color: #0000ff;"><span style="color: #0000ff;">Interface</span></span>Niounsafe<span style="color: #0000ff;"><span style="color: #0000ff;">extends</span></span><span style="color: #000000;"><span style="color: #000000;">Unsafe {selectablechannel Ch (); </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">void</span></span><span style="color: #000000;"><span style="color: #000000;">Finishconnect (); </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">void</span></span><span style="color: #000000;"><span style="color: #000000;">Read (); </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">void</span></span><span style="color: #000000;"><span style="color: #000000;">Forceflush (); }}</span></span></pre><p><p></p></p><p><p>Niosocketchannelunsafe inheritance: niosocketchannelunsafe, niobyteunsafe, abstractniounsafe, Abstractunsafe</p></p><p><p>Abstractunsafe: responsible for socket link binding, acceptance, shutdown, data fush operation</p></p><p><p>Each operation is handled in approximately four stages</p></p><pre><span style="color: #000000;"><span style="color: #000000;">@Override</span></span><span style="color: #0000ff;"><span style="color: #0000ff;"></span> public</span> <span style="color: #0000ff;"><span style="color: #0000ff;">Final</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">void</span></span>Bind<span style="color: #0000ff;"><span style="color: #0000ff;">Final</span></span>SocketAddress localaddress,<span style="color: #0000ff;"><span style="color: #0000ff;">Final</span></span><span style="color: #000000;"><span style="color: #000000;">channelpromise Promise) {asserteventloop (); </span></span><span style="color: #008000;"><span style="color: #008000;">//</span></span><span style="color: #008000;"><span style="color: #008000;">pre-execution Check</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">if</span></span>(!promise.setuncancellable () | | |<span style="color: #000000;"><span style="color: #000000;">Ensureopen (promise)) { </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">return</span></span><span style="color: #000000;"><span style="color: #000000;">; } </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">Boolean</span></span>Wasactive =<span style="color: #000000;"><span style="color: #000000;">isActive (); </span></span><span style="color: #008000;"><span style="color: #008000;">//</span></span><span style="color: #008000;"><span style="color: #008000;">Call Implementation</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">Try</span></span><span style="color: #000000;"><span style="color: #000000;">{dobind (localaddress); } </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">Catch</span></span><span style="color: #000000;"><span style="color: #000000;">(throwable t) {safesetfailure (promise, t); Closeifclosed (); </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">return</span></span><span style="color: #000000;"><span style="color: #000000;">; } </span></span><span style="color: #008000;"><span style="color: #008000;">//</span></span><span style="color: #008000;"><span style="color: #008000;">Call the business, notify pipeline</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">if</span></span>(!wasactive &&<span style="color: #000000;"><span style="color: #000000;">isActive ()) {invokelater ()</span></span>-<span style="color: #000000;"><span style="color: #000000;">pipeline.firechannelactive ();); } </span></span><span style="color: #008000;"><span style="color: #008000;">//</span></span><span style="color: #008000;"><span style="color: #008000;">Complete Stage Processing</span></span><span style="color: #000000;"><span style="color: #000000;">safesetsuccess (promise); }</span></span></pre><p><p></p></p><pre><span style="color: #000000;"><span style="color: #000000;">@Override</span></span><span style="color: #0000ff;"><span style="color: #0000ff;"></span> public</span> <span style="color: #0000ff;"><span style="color: #0000ff;">Final</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">void</span></span><span style="color: #000000;"><span style="color: #000000;">Flush () {asserteventloop (); Channeloutboundbuffer Outboundbuffer</span></span>=<span style="color: #0000ff;"><span style="color: #0000ff;"></span> this</span><span style="color: #000000;"><span style="color: #000000;">. outboundbuffer; </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">if</span></span>(outboundbuffer = =<span style="color: #0000ff;"><span style="color: #0000ff;">NULL</span></span><span style="color: #000000;"><span style="color: #000000;">) { </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">return</span></span><span style="color: #000000;"><span style="color: #000000;">; } Outboundbuffer.addflush (); Flush0 (); } @SuppressWarnings (</span></span>"deprecation"<span style="color: #000000;"><span style="color: #000000;">) </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">protected</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">void</span></span><span style="color: #000000;"><span style="color: #000000;">flush0 () {</span></span><span style="color: #008000;"><span style="color: #008000;">//</span></span><span style="color: #008000;"><span style="color: #008000;">just finished flush operation</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">if</span></span><span style="color: #000000;"><span style="color: #000000;">(inFlush0) {</span></span><span style="color: #0000ff;"><span style="color: #0000ff;">return</span></span><span style="color: #000000;"><span style="color: #000000;">; } </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">Final</span></span>Channeloutboundbuffer Outboundbuffer =<span style="color: #0000ff;"><span style="color: #0000ff;"></span> this</span><span style="color: #000000;"><span style="color: #000000;">. outboundbuffer; </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">if</span></span>(outboundbuffer = =<span style="color: #0000ff;"><span style="color: #0000ff;">NULL</span></span>||<span style="color: #000000;"><span style="color: #000000;">Outboundbuffer.isempty ()) { </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">return</span></span><span style="color: #000000;"><span style="color: #000000;">; } inFlush0</span></span>=<span style="color: #0000ff;"><span style="color: #0000ff;">true</span></span><span style="color: #000000;"><span style="color: #000000;">; </span></span><span style="color: #008000;"><span style="color: #008000;">//</span></span><span style="color: #008000;"><span style="color: #008000;">link check before sending data</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">if</span></span>(!<span style="color: #000000;"><span style="color: #000000;">isActive ()) { </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">Try</span></span><span style="color: #000000;"><span style="color: #000000;"> { </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">if</span></span><span style="color: #000000;"><span style="color: #000000;">(isOpen ()) {</span></span><span style="color: #008000;"><span style="color: #008000;">//</span></span><span style="color: #008000;"><span style="color: #008000;">true to notify the handler channelwritabilitychanged method</span></span>Outboundbuffer.failflushed (flush0_not_yet_connected_exception,<span style="color: #0000ff;"><span style="color: #0000ff;">true</span></span><span style="color: #000000;"><span style="color: #000000;">); } </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">Else</span></span><span style="color: #000000;"><span style="color: #000000;">{outboundbuffer.failflushed (flush0_closed_channel_exception,</span></span><span style="color: #0000ff;"><span style="color: #0000ff;">false</span></span><span style="color: #000000;"><span style="color: #000000;">); } } </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">finally</span></span><span style="color: #000000;"><span style="color: #000000;">{inFlush0</span></span>=<span style="color: #0000ff;"><span style="color: #0000ff;">false</span></span><span style="color: #000000;"><span style="color: #000000;">; } </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">return</span></span><span style="color: #000000;"><span style="color: #000000;">; } </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">Try</span></span><span style="color: #000000;"><span style="color: #000000;"> { </span></span><span style="color: #008000;"><span style="color: #008000;">//</span></span><span style="color: #008000;"><span style="color: #008000;">Call Channel Implementation</span></span><span style="color: #000000;"><span style="color: #000000;">Dowrite (outboundbuffer); } </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">Catch</span></span><span style="color: #000000;"><span style="color: #000000;">(throwable T) {</span></span><span style="color: #0000ff;"><span style="color: #0000ff;">if</span></span>(t<span style="color: #0000ff;"><span style="color: #0000ff;">instanceof</span></span>IOException &&<span style="color: #000000;"><span style="color: #000000;">config (). isautoclose ()) {close (voidpromise (), t, flush0_closed_channel_exception,</span></span><span style="color: #0000ff;"><span style="color: #0000ff;">false</span></span><span style="color: #000000;"><span style="color: #000000;">); } </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">Else</span></span><span style="color: #000000;"><span style="color: #000000;">{outboundbuffer.failflushed (t,</span></span><span style="color: #0000ff;"><span style="color: #0000ff;">true</span></span><span style="color: #000000;"><span style="color: #000000;">); } } </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">finally</span></span><span style="color: #000000;"><span style="color: #000000;">{inFlush0</span></span>=<span style="color: #0000ff;"><span style="color: #0000ff;">false</span></span><span style="color: #000000;"><span style="color: #000000;">; } }</span></span></pre><p><p></p></p><p><p>Abstractniounsafe: is the Niounsafe interface template class, Simple packaging</p></p><p><p>Niobyteunsafe: Main to Niounsafe interface read operation implementation</p></p><p><p>Niosocketchannelunsafe: It's just a simple wrapper, which is finally exposed to internal use</p></p><p><p>Niobyteunsafe Read method</p></p><pre> <span style="color: #0000ff;"><span style="color: #0000ff;"></span> public</span> <span style="color: #0000ff;"><span style="color: #0000ff;">Final</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">void</span></span><span style="color: #000000;"><span style="color: #000000;">Read () {</span></span><span style="color: #0000ff;"><span style="color: #0000ff;">Final</span></span>Channelconfig config =<span style="color: #000000;"><span style="color: #000000;">Config (); </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">Final</span></span>Channelpipeline pipeline =<span style="color: #000000;"><span style="color: #000000;">Pipeline (); </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">Final</span></span>Bytebufallocator allocator =<span style="color: #000000;"><span style="color: #000000;">Config.getallocator (); </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">Final</span></span>Recvbytebufallocator.handle Allochandle =<span style="color: #000000;"><span style="color: #000000;">Recvbufallochandle (); Allochandle.reset (config); Bytebuf Bytebuf</span></span>=<span style="color: #0000ff;"><span style="color: #0000ff;">NULL</span></span><span style="color: #000000;"><span style="color: #000000;">; </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">Boolean</span></span>Close =<span style="color: #0000ff;"><span style="color: #0000ff;">false</span></span><span style="color: #000000;"><span style="color: #000000;">; </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">Try</span></span><span style="color: #000000;"><span style="color: #000000;"> { </span></span><span style="color: #0000ff;"><span style="color: #0000ff;"></span> do</span><span style="color: #000000;"><span style="color: #000000;">{bytebuf</span></span>=<span style="color: #000000;"><span style="color: #000000;">allochandle.allocate (allocator); </span></span><span style="color: #008000;"><span style="color: #008000;">//</span></span><span style="color: #008000;"><span style="color: #008000;">Fill BYTEBUF call channel implementation</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">int</span></span>Size =<span style="color: #000000;"><span style="color: #000000;">doreadbytes (bytebuf); </span></span><span style="color: #008000;"><span style="color: #008000;">//</span></span><span style="color: #008000;"><span style="color: #008000;">record last read length</span></span><span style="color: #000000;"><span style="color: #000000;">Allochandle.lastbytesread (size); </span></span><span style="color: #008000;"><span style="color: #008000;">//</span></span><span style="color: #008000;"><span style="color: #008000;">link off, release bytebuf</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">if</span></span>(allochandle.lastbytesread () <= 0<span style="color: #000000;"><span style="color: #000000;">) {bytebuf.release (); Bytebuf</span></span>=<span style="color: #0000ff;"><span style="color: #0000ff;">NULL</span></span><span style="color: #000000;"><span style="color: #000000;">; Close</span></span>= Allochandle.lastbytesread () < 0<span style="color: #000000;"><span style="color: #000000;">; </span></span><span style="color: #0000ff;"><span style="color: #0000ff;"></span> break</span><span style="color: #000000;"><span style="color: #000000;">; } </span></span><span style="color: #008000;"><span style="color: #008000;">//</span></span><span style="color: #008000;"><span style="color: #008000;">self-increment message read processing times</span></span>Allochandle.incmessagesread (1<span style="color: #000000;"><span style="color: #000000;">); </span></span><span style="color: #008000;"><span style="color: #008000;">//</span></span><span style="color: #008000;"><span style="color: #008000;">filled BYTEBUF call business pipeline completed</span></span>Readpending =<span style="color: #0000ff;"><span style="color: #0000ff;">false</span></span><span style="color: #000000;"><span style="color: #000000;">; Pipeline.firechannelread (bytebuf); Bytebuf</span></span>=<span style="color: #0000ff;"><span style="color: #0000ff;">NULL</span></span><span style="color: #000000;"><span style="color: #000000;">; } </span></span><span style="color: #0000ff;"><span style="color: #0000ff;"></span> while</span><span style="color: #000000;"><span style="color: #000000;">(allochandle.continuereading ()); Allochandle.readcomplete (); Pipeline.firechannelreadcomplete (); </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">if</span></span><span style="color: #000000;"><span style="color: #000000;">(close) {closeonread (pipeline); } } </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">Catch</span></span><span style="color: #000000;"><span style="color: #000000;">(throwable t) {handlereadexception (pipeline, bytebuf, t, close, allochandle); } </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">finally</span></span><span style="color: #000000;"><span style="color: #000000;"> { </span></span><span style="color: #008000;"><span style="color: #008000;">//</span></span><span style="color: #008000;"><span style="color: #008000;">if it is not active read to be completed after you want to clean the read op</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">if</span></span>(!readpending &&!)<span style="color: #000000;"><span style="color: #000000;">Config.isautoread ()) {removereadop (); } } } }</span></span></pre><p><p>Summary: It can be seen that no calculation code, unsafe only to achieve boundary inspection, process control, concrete implementation to the upper processing</p></p><p><p>[weave message frame] [netty Source analysis]7 Unsafe Implementation Class NIOSOCKETCHANNELUNSAFE responsibility and implementation</p></p></span>

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.