netty 409final版本Word格式.docx
《netty 409final版本Word格式.docx》由会员分享,可在线阅读,更多相关《netty 409final版本Word格式.docx(16页珍藏版)》请在冰豆网上搜索。
VoidChannelPromise(this,
true);
7.private
unsafeVoidPromise
false);
8.private
CloseFuture
closeFuture
CloseFuture(this);
9.
10.private
volatile
SocketAddress
localAddress;
11.private
remoteAddress;
12.private
EventLoop
eventLoop;
13.private
boolean
registered;
14.
15./**
Cache
for
the
string
representation
of
this
channel
*/
16.private
strValActive;
17.private
String
strVal;
<
pre
name="
code"
class="
java"
>
/**
18.
*
Creates
a
instance.
19.
20.
@param
parent
21.
channel.
{@code
null}
if
there'
s
no
parent.
22.
23.protected
AbstractChannel(Channel
parent)
{
24.
this.parent
25.
unsafe
newUnsafe();
26.
pipeline
DefaultChannelPipeline(this);
27.}<
/pre>
比较重要的对象是pipeline和unsafe,它们提供对read,write,bind等操作的具体实现。
3)AbstractNioChannel
AbstractNioChannel继承AbstractChannel,从这个类开始涉及到JDK的socket,参考如下关键代码:
1.
private
SelectableChannel
ch;
2.
protected
int
readInterestOp;
3.
SelectionKey
selectionKey;
4.
inputShutdown;
5.<
@Override
6.
void
doRegister()
throws
Exception
7.
selected
false;
8.
(;
;
)
try
10.
selectionKey
javaChannel().register(eventLoop().selector,
0,
this);
11.
return;
12.
}
catch
(CancelledKeyException
e)
13.
(!
selected)
//
Force
Selector
to
select
now
as
"
canceled"
may
still
be
15.
cached
and
not
removed
because
Select.select(..)
operation
was
called
yet.
16.
eventLoop().selectNow();
17.
true;
else
We
forced
on
selector
before
but
is
whatever
reason.
JDK
bug
?
throw
e;
23.
}<
br>
Create
instance
{@link
Channel}
by
which
created.
May
ch
underlying
SelectableChannel}
it
operates
readInterestOp
ops
set
receive
data
from
AbstractNioChannel(Channel
parent,
ch,
readInterestOp)
super(parent);
this.ch
this.readInterestOp
ch.configureBlocking(false);
(IOException
ch.close();
e2)
(logger.isWarnEnabled())
logger.warn(
Failed
close
partially
initialized
socket."
e2);
ChannelException("
enter
non-blocking
mode."
e);
从上面的代码可以看出,这里定义真正的SocketChannel(SelectableChannel),关心的事件,注册后的key。
将Socket设置为非阻塞,这是所有异步IO的关键,也就是说不管多么好的框架,底层基础还是不会变,可见学好基础的重要性啊,^_^。
这里重点要关注一下register函数,这个函数是将Channel和事件循环进行关联的关键。
每个事件循环都有一个自己的selector,channel实际上是注册到了相应eventloop的selector中,这也是NioSocket编程的基础。
从这个类中已经可以看到netty的channel是如何和socket的niochannel关联的了,以及channel是如何和eventloop关联的了。
4)AbstractNioMessageChannel
这个类继承AbstractNioChannel,主要是提供了一个newUnsafe方法返回NioMessageUnsafe对象的实例(实现read方法)。
另外还定义doReadMessages和doWriteMessage两个抽象方法。
5)ServerSocketChannel和ServerChannel
这两个接口主要是定义了一个config方法,以及获取网络地址的方法。
6)NioServerSocketChannel
NioServerSocketChannel继承AbstractNioMessageChannel,实现ServerSocketChannel,它是一个具体类,提供给开发者使用。
1./**
A
ty.channel.socket.ServerSocketChannel}
implementation
uses
NIO
based
accept
connections.
5.public
class
NioServerSocketChannel
extends
AbstractNioMessageChannel
implements
ty.channel.socket.ServerSocketChannel
static
ChannelMetadata
METADATA
ChannelMetadata(false);
InternalLogger
logger
InternalLoggerFactory.getInstance(NioServerSocketChannel.class);
ServerSocketChannel
newSocket()
return
ServerSocketChannel.open();
ChannelException(
open
server
ServerSocketChannelConfig
config;
public
NioServerSocketChannel()
27.
super(null,
newSocket(),
SelectionKey.OP_ACCEPT);
28.
config
DefaultServerSocketChannelConfig(this,
javaChannel().socket());
29.
30.
31.
32.
javaChannel()
33.
(ServerSocketChannel)
super.javaChannel();
34.
35.
36.
37.
doBind(SocketAddress
localAddress)
38.
javaChannel().socket().bind(localAddress,
config.getBacklog());
39.
40.
41.
42.
doClose()
43.
javaChannel().close();
44.
45.
46.
47.
doReadMessages(List<
Object>
buf)
48.
SocketChannel
javaChannel().accept();
49.
50.
51.
(ch
!
null)
52.
buf.add(new
NioSocketChannel(this,
ch));
53.
1;
54.
55.
(Throwable
t)
56.
logger.warn("
create
an
accepted
t);
57.
58.
59.
60.
t2)
61.
t2);
62.
63.
64.
65.
0;
66.
67.
68.
Unnecessary
stuff
69.
70.
doConnect(
71.
remoteAddress,
72.
UnsupportedOperationException();
73.
74.
75.
76.
doFinishConnect()
77.
78.
79.
80.
81.
remoteAddress0()
82.
null;
83.
84.
85.
86.
doDisconnect()
87.
88.
89.
90.
91.
doWriteMessage(Object
msg,
ChannelOutboundBuffer
in)
92.
93.
94.}
从这个具体类中,我们可以看到,调用JDK函数ServerSocketChannel.open();
生成了底层ServerSocketChannel对象,将NioServerSocketChannel和ServerSocketChannel相关联,并且传递了感兴趣的事件OP_ACCEPT给父类。
实现了doReadMessage函数,实际上就是accept一个SocketChanel。
2.2
基于NioSocketChannel进行分析
在NioServerSocketChannel中介绍过的类和接口,这里不再介绍。
其实和NioServerSocketChannel差不多,只是它是基于Byte的。
1)AbstractNioByteChannel
这个类继承AbstractNioChannel,主要也是提供了一个newUnsafe方法返回NioByteUnsafe对象的实例(实现read方法)。
另外还定义doReadBytes和doWriteBytes两个抽象方法。
2)SocketChannel
这个接口继承了Channel接口,定义了多个shutdown方法,以及一个parent方法,返回该SocketChannel相应的ServerSocketChannel。
3)NioSocketChannel
这个类继承AbstractNioByteChannel,并且实现SocketChannel接口,是一个具体类,提供给开发者使用。
ty.channel.socket.SocketChannel}
implementation.
4.public
NioSocketChannel
AbstractNioByteChannel
ty.channel.socket.SocketChannel
5.
SocketChannel.open();
SocketChannelConfig
NioSocketChannel()
this(newSocket());
using
given
SocketChannel}.
NioSocketChannel(SocketChannel
socket)
this(null,