没有合适的资源?快使用搜索试试~ 我知道了~
首页netty源码分析之服务端启动全解析
netty源码分析之服务端启动全解析
需积分: 9 131 浏览量
更新于2023-05-29
评论
收藏 1.21MB PDF 举报
netty基本使用以及入门资料,具有netty的源码的分析以及服务器启动过程的介绍
资源详情
资源评论
资源推荐

2018/7/3 20)24nettyრᎱړຉԏ๐ۓᒒސۖقᥴຉ - ᓌԡ
ᒫ 1 ᶭҁو 21 ᶭ҂https://www.jianshu.com/p/c5068caab217
nettyრᎱړຉԏ๐ۓᒒސۖقᥴຉ
(!"!#$%&'&()*+,')
-
ᓌԡᳬኪׂ-(!"!#$%&'&()*+,')
- ! ىဳ
(.*/0*(0*.-(.1)'2 -හ-#3+# -ᴅ-*(((( ᦧᦞ-*/ ࡅཻ-'4 ᩩᩝ-(
background
5,667-ฎӞӻྍԪկḝۖጱᗑᕶ᭗מຝٌ҅ොጱᥴ᯽ԅ
8,667-9:-;-8<=-&>9,56-:,?@,?-$?;A,BC?D-BE9&E-,5;F>,:-G"9&D-;5%-,;:7
%,@,>CHA,56-C$-5,6BC?D-;HH>9&;69C5:-:"&E-;:-H?C6C&C>-:,?@,?:-;5%-&>9,56:0-<6
I?,;6>7-:9AH>9$9,:-;5%-:6?,;A>95,:-5,6BC?D-H?CI?;AA95I-:"&E-;:-JKL-;5%-MNL
:C&D,6-:,?@,?0
౯ժࣁෛᗦၾ௳വᭆᔮᕹ:;9>$9:E(෭࣐വᭆၾ௳ᰁ+.Պ)҅ෛᗦᑏۖᒒդቘս۸ᔮᕹ
:E;?D(෭࣐ރݺᰁ).Պ)Ӿ࣐҅ᭌೠԧ5,667֢ԅବᗑᕶ᭗מຝ
෬ᆐӷইྌ᯿ᥝጱᔮᕹବ᮷ֵአکԧ5,667҅ಅզᆐᥝ5,667ጱګ҅ኜᛗრᎱԧ
ᝑഩ҅ԭฎ҅؛ኞԧ5,667რᎱᔮڜᒍݸᶎ҅౯տ᭗ᬦӞᔮڜጱԆ౯5,667
რᎱ᯾ಅکጱྺ෫כኸࣈՕᕨᕳ֦҅რᎱԭ#0*0/0O95;>
why netty
5,667ବԭP%Dጱ8<=҅౯ժԅՋԍӧፗളԭP%Dጱ59Cᘏٌ՜59CຝҘӥᶎฎ౯
ᕮڊጱܻࢩ
*0ֵአP%Dᛔଃጱ59Cᵱᥝԧᥴጱ༷ஷ҅ᖫᑕ
(05,667ବ<=ཛྷࣳᵋڔഘ҅ᘒᬯӞڔݝᵱᥝ؉ஙጱදۖ
)05,667ᛔଃጱೆ۱ᥴ۱҅ଉ༄ၥᒵګᦏ֦59Cጱᔺ᯿ᕡᜓӾᚙᐶڊ҅ᦏ֦ݝᵱᥝ
ىஞӱۓ᭦ᬋ
#05,667ᥴ٬ԧP%Dጱஉ۱ೡᑮᦒࣁٖጱF"I
+05,667ବᕚᑕ҅:,>,&6C?؉ԧஉᕡጱս۸҅ᔜஞᦡᦇጱ?,;&6C?ᕚᑕ؉کᶋଉṛ
පጱଚݎቘ
/0ᛔଃݱᐿܐᦓᦏ֦ቘձ֜Ӟᐿ᭗አܐᦓ᮷پԒӧአՅᛔۖಋ
30 5,667ᐒ܄ၚ᭬҅کᳯᵋᮒկڜᤒᘏ9::",
'05,667૪ᕪܲݱ?H&ຝ҅ၾ௳Ӿᳵկ҅ړୗ᭗מӾᳵկᕚӤጱଠာḵᦤ҅؋෫
ྲ୩
dive into netty
ԧᥴԧᬯԍ҅Ք౯ժӞӻֺৼڊ҅ত౯ժጱ5,667რᎱԏ
ᓤԆᥝᦖᬿጱฎ5,667ฎই֜ᕬᒒݗ҅ސۖ๐ۓސۖ๐ۓጱᬦᑕӾ֦҅տԧᥴک
5,667ݱ໐ஞᕟկ҅౯ضӧտᕡᦖᬯԶᕟկ҅ᘒฎտޞᦫ֦ݱᕟկฎெԍԀ᩸ᕟ౮
5,667ጱ໐ஞ
example

2018/7/3 20)24nettyრᎱړຉԏ๐ۓᒒސۖقᥴຉ - ᓌԡ
ᒫ 2 ᶭҁو 21 ᶭ҂https://www.jianshu.com/p/c5068caab217
ӥᶎฎӞӻᶋଉᓌܔጱ๐ۓᒒސۖդᎱ
public final class SimpleServer {
public static void main(String[] args) throws Exception {
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.handler(new SimpleServerHandler())
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
public void initChannel(SocketChannel ch) throws Exceptio
n {
}
});
ChannelFuture f = b.bind(8888).sync();
f.channel().closeFuture().sync();
} finally {
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
}
}
private static class SimpleServerHandler extends ChannelInboundHandlerAdapter
{
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
System.out.println("channelActive");
}
@Override
public void channelRegistered(ChannelHandlerContext ctx) throws Exception
{
System.out.println("channelRegistered");
}
@Override
public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
System.out.println("handlerAdded");
}
}
}
ᓌܔጱپᤈդᎱᚆސӞӻ๐ۓᒒ҅ᒒݗᕬࣁ''''ֵ҅አ59Cཛྷୗ҅ӥᶎᦖӥྯӞ
ӻྍṈጱቘᕡᜓ
EventLoopGroup -૪ᕪࣁ౯ጱٌ՜ᒍ-(E66H:Q!!BBB0P9;5:E"0&CA!H!.%.,,&,/%#/3)Ӿᧇ
ᕡڽຉᬦ҅᧔ጮԧ҅ฎӞӻྒሾ҅ӧ؊ࣈ༄ၥ<=Ԫկ҅ቘ<=Ԫկ҅ಗᤈձۓ
ServerBootstrap -ฎ๐ۓᒒጱӞӻސۖᬀۗᔄ҅᭗ᬦᕳ՜ᦡᗝӞᔮڜ݇හᕬᒒݗސۖ
๐ۓ
group(bossGroup, workerGroup) -౯ժᵱᥝӷᐿᔄࣳጱՈଗၚ҅Ӟӻฎᘌ҅Ӟӻฎૡ
Ո҅ᘌᨮᨱᶎളၚ҅ളکጱၚړᯈᕳૡՈଗ҅නکᬯ᯾҅ bossGroup ጱ֢አฎӧ
ෙࣈ;&&,H6کෛጱᬳള҅ෛጱᬳളӶᕳ workerGroup ቘ
.channel(NioServerSocketChannel.class) -ᤒᐏ๐ۓᒒސۖጱฎ59Cፘىጱ&E;55,>҅
&E;55,>ࣁ5,667᯾ᶎฎӞ໐ஞ༷ஷ҅ݢզቘᥴԅӞ&E;55,>ฎӞӻᬳളᘏӞӻ๐
ۓᒒF95%֢ۖ҅ݸᶎտᕡ᧔
.handler(new SimpleServerHandler() -ᤒᐏ๐ۓސۖᬦᑕӾ҅ᵱᥝᕪᬦߺԶၞᑕ҅ᬯ᯾
SimpleServerHandler ๋ᕣጱᶮളݗԅ ChannelHander ҅ฎ5,667ጱӞ໐ஞ༷ஷ҅ᤒᐏ
හഝၞᕪᬦጱቘ҅ݢզቘᥴԅၞᕚӤጱྯӞ᭲ىܜ

2018/7/3 20)24nettyრᎱړຉԏ๐ۓᒒސۖقᥴຉ - ᓌԡ
ᒫ 3 ᶭҁو 21 ᶭ҂https://www.jianshu.com/p/c5068caab217
childHandler(new ChannelInitializer<SocketChannel>)... ᤒᐏӞෛጱᬳളᬰԏݸ҅
ᧆெԍቘ҅ԞฎӤᶎಅ᧔ጱ҅ᘌই֜ᕳૡՈᯈၚ
ChannelFuture f = b.bind(8888).sync(); -ᬯ᯾ฎ፥ྋጱސۖᬦᑕԧ҅ᕬ''''ᒒݗ҅
ᒵஇ๐ۓސۖླ҅տᬰفӥᤈդᎱ
f.channel().closeFuture().sync(); -ᒵஇ๐ۓᒒىᳮ:C&D,6
bossGroup.shutdownGracefully(); workerGroup.shutdownGracefully(); -ىᳮӷᕟྒሾ
ӤᬿդᎱݢզஉຂࣈٚࣈ᪒๋᩸҅ᕣഴګݣጱᬌڊԅғ
handlerAdded
channelRegistered
channelActive
ىԭԅՋԍտᶲଧᬌڊᬯԶ҅Ⴎفړຉԏݸٌஉ,;:7
Ⴎفᕡᜓ
ServerBootstrap -Ӟᔮڜጱ݇හᯈᗝٌဌࠨঅᦖጱ҅෫ᶋฎֵአA,6EC%-&E;9595I
(E66H:Q!!,50B9D9H,%9;0C?I!B9D9!R,6EC%S&E;9595ITU;@;)ጱොୗސۖ๐ۓᵱᥝጱ݇හ
כک$9>,%౯ժጱ᯿ᅩ៧فکӥᶎᬯྦྷդᎱ
b.bind(8888).sync();
ᬯ᯾᧔Ӟݙғ౯ժڟতრᎱ҅ᕡᜓဌᮎԍႴ༩ጱఘ٭ӥݢզۗ<NVጱ%,F"Iۑ
ᚆ҅:6,H-F7-:6,H҅C5,-:6,H-C5,-6,:6ᘏԫړ6,:6ጱොୗ҅ᏟߺᤈդᎱฎ๋ᕣސۖ
๐ۓጱفݗ҅ࣁᬯ᯾҅౯ժ૪ᕪᏟԧF95%ොဩฎفݗ҅౯ժ᪙ᬰ݄҅ړຉ
public ChannelFuture bind(int inetPort) {
return bind(new InetSocketAddress(inetPort));
}
᭗ᬦᒒݗݩڠୌӞӻ- InetSocketAddress ҅ᆐݸᖀᖅF95%
public ChannelFuture bind(SocketAddress localAddress) {
validate();
if (localAddress == null) {
throw new NullPointerException("localAddress");
}
return doBind(localAddress);
}
validate() -ḵᦤ๐ۓސۖᵱᥝጱᥝ݇හ҅ᆐݸ᧣አ doBind()
private ChannelFuture doBind(final SocketAddress localAddress) {
//...
final ChannelFuture regFuture = initAndRegister();
//...
final Channel channel = regFuture.channel();
//...
doBind0(regFuture, channel, localAddress, promise);
//...
return promise;
}

2018/7/3 20)24nettyრᎱړຉԏ๐ۓᒒސۖقᥴຉ - ᓌԡ
ᒫ 4 ᶭҁو 21 ᶭ҂https://www.jianshu.com/p/c5068caab217
ᬯ᯾҅౯݄ധԧᕡຏ๛ᜓ҅ᦏ౯ժӫဳԭ໐ஞොဩٌ҅ӷ໐ஞӞӻฎ-
initAndRegister() ҅զ݊ doBind0()
ٌ҅ොဩݷӤᶎ౯ժ૪ᕪݢզኼᒁӞԫ҅9596WXڡত۸҅?,I9:6,?WXဳٙ҅ᮎԍکବ
ᥝဳٙکՋԍޫҘᘶᔮک59C᯾ᶎᧃጱဳٙ҅ݢᚆฎӻӳᥜڡত۸অԧԏݸဳٙ
ک:,>,&6C?Ӥᶎ๋݄҅ݸF95%҅؟ฎࣁࣈᕬᒒݗݩ҅ଃ፳ᬯԶሖၥ҅౯ժႮفӥ݄
initAndRegister()
final ChannelFuture initAndRegister() {
Channel channel = null;
// ...
channel = channelFactory.newChannel();
//...
init(channel);
//...
ChannelFuture regFuture = config().group().register(channel);
//...
return regFuture;
}
౯ժᬮฎӫဳԭ໐ஞդᎱ҅ಲᬟා҅౯ժک- initAndRegister() -؉ԧپկԪఘ
*05,BӞӻ&E;55,>
(09596ᬯӻ&E;55,>
)0ᬯӻ&E;55,>-?,I9:6,?کӻ
౯ժ᭑ྍړຉᬯӣկԪఘ
1.newӞӻchannel
౯ժḒضᥝ&E;55,>ጱԎ҅5,667ො&E;55,>ጱൈᬿইӥ
Y-5,Z":-6C-;-5,6BC?D-:C&D,6-C?-;-&CAHC5,56-BE9&E-9:-&;H;F>,-C$-<!=-CH,?;69C5:
:"&E-;:-?,;%,-B?96,,-&C55,&6,-;5%-F95%
ᬯ᯾ጱ&E;55,>҅ኧԭฎࣁ๐ۓސۖጱײڠୌ҅౯ժݢզฦ᭗[C&D,6ᖫᑕӾጱ
[,?@,?[C&D,6ଫӤ҅ᤒᐏ๐ۓᒒᕬጱײᕪᬦጱӞၞᕚ
౯ժݎሿᬯ&E;55,>ฎ᭗ᬦӞӻ- channelFactory -5,Bڊጱ҅ channelFactory -ጱളݗ
உᓌܔ
public interface ChannelFactory<T extends Channel> extends io.netty.bootstrap.Cha
nnelFactory<T> {
/**
* Creates a new channel.
*/
@Override
T newChannel();
}
Ӟӻොဩ҅౯ժັ&E;55,>O;&6C?7ᤩᩙ꧊ጱࣈො
YF:6?;&6\CC6:6?;H0P;@;

2018/7/3 20)24nettyრᎱړຉԏ๐ۓᒒސۖقᥴຉ - ᓌԡ
ᒫ 5 ᶭҁو 21 ᶭ҂https://www.jianshu.com/p/c5068caab217
public B channelFactory(ChannelFactory<? extends C> channelFactory) {
if (channelFactory == null) {
throw new NullPointerException("channelFactory");
}
if (this.channelFactory != null) {
throw new IllegalStateException("channelFactory set already");
}
this.channelFactory = channelFactory;
return (B) this;
}
ࣁᬯ᯾ᤩᩙ꧊҅౯ժࢧშ҅ັᧆڍහᤩ᧣አጱࣈො҅ݎሿ๋ᕣฎࣁᬯӻڍහӾ҅
KE;55,>O;&6C?7ᤩ5,Bڊ
public B channel(Class<? extends C> channelClass) {
if (channelClass == null) {
throw new NullPointerException("channelClass");
}
return channelFactory(new ReflectiveChannelFactory<C>(channelClass));
}
ᬯ᯾҅౯ժጱ%,ACᑕଧ᧣አ channel(channelClass) ොဩጱײ҅ channelClass ֢
ԅ ReflectiveChannelFactory ጱ᭜ڍහڠୌڊӞӻ ReflectiveChannelFactory
%,ACᒒጱդᎱইӥғ
.channel(NioServerSocketChannel.class);
ᆐݸࢧکᜓ๋ত
channelFactory.newChannel();
౯ժݢզവෙڊ๋҅ᕣฎ᧣አک- ReflectiveChannelFactory.newChannel() -ොဩ҅᪙ᬰ
public class ReflectiveChannelFactory<T extends Channel> implements ChannelFactor
y<T> {
private final Class<? extends T> clazz;
public ReflectiveChannelFactory(Class<? extends T> clazz) {
if (clazz == null) {
throw new NullPointerException("clazz");
}
this.clazz = clazz;
}
@Override
public T newChannel() {
try {
return clazz.newInstance();
} catch (Throwable t) {
throw new ChannelException("Unable to create Channel from class " + c
lazz, t);
}
}
}
ک clazz.newInstance(); ҅౯ժกጮԧܻ҅ฎ᭗ᬦݍጱොୗڠୌӞӻ҅ᘒᬯ
ӻ&>;::ฎ౯ժࣁ ServerBootstrap Ӿփفጱ NioServerSocketChannel.class
ᕮຎ҅ᕰԧӞࢻ๋҅ᕣڠୌ&E;55,>ፘ୮ԭ᧣አἕᦊ᭜ڍහ5,BڊӞӻ-
NioServerSocketChannel
剩余20页未读,继续阅读


















五坏学生
- 粉丝: 2
- 资源: 5
上传资源 快速赚钱
我的内容管理 收起
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助

会员权益专享
最新资源
- Xilinx SRIO详解.pptx
- Informatica PowerCenter 10.2 for Centos7.6安装配置说明.pdf
- 现代无线系统射频电路实用设计卷II 英文版.pdf
- 电子产品可靠性设计 自己讲课用的PPT,包括设计方案的可靠性选择,元器件的选择与使用,降额设计,热设计,余度设计,参数优化设计 和 失效分析等
- MPC5744P-DEV-KIT-REVE-QSG.pdf
- 通信原理课程设计报告(ASK FSK PSK Matlab仿真--数字调制技术的仿真实现及性能研究)
- ORIGIN7.0使用说明
- 在VMware Player 3.1.3下安装Redhat Linux详尽步骤
- python学生信息管理系统实现代码
- 西门子MES手册 13 OpcenterEXCR_PortalStudio1_81RB1.pdf
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制

评论0