netty 409final版本Word格式.docx

上传人:b****5 文档编号:19492145 上传时间:2023-01-06 格式:DOCX 页数:16 大小:64.98KB
下载 相关 举报
netty 409final版本Word格式.docx_第1页
第1页 / 共16页
netty 409final版本Word格式.docx_第2页
第2页 / 共16页
netty 409final版本Word格式.docx_第3页
第3页 / 共16页
netty 409final版本Word格式.docx_第4页
第4页 / 共16页
netty 409final版本Word格式.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

netty 409final版本Word格式.docx

《netty 409final版本Word格式.docx》由会员分享,可在线阅读,更多相关《netty 409final版本Word格式.docx(16页珍藏版)》请在冰豆网上搜索。

netty 409final版本Word格式.docx

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 

instance. 

19. 

20. 

@param 

parent 

21. 

channel. 

{@code 

null} 

if 

there'

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./** 

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,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 高考

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1