| ±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚcsdn,ÎÄÕÂÖ÷Òª½éÉÜÁËNettyµÄ»ù´¡£¬ÓÐÊ²Ã´ÌØµã£¬Æä¹¹³É²¿·ÖÊÇʲô£¬ÒÔ¼°Ïà¹ØµÄÓ¦Óᣠ|
|
1.ʲôÊÇNetty£¿
NettyÊÇÒ»¸öÀûÓÃJavaµÄ¸ß¼¶ÍøÂçµÄÄÜÁ¦£¬Òþ²ØÆä±³ºóµÄ¸´ÔÓÐÔ¶øÌṩһ¸öÒ×ÓÚʹÓõÄAPIµÄ¿Í»§¶Ë/·þÎñÆ÷¿ò¼Ü¡£NettyÌṩ¸ßÐÔÄܺͿÉÀ©Õ¹ÐÔ£¬ÈÃÄã¿ÉÒÔ×ÔÓɵØ×¨×¢ÓÚÄãÕæÕý¸ÐÐËȤµÄ¶«Î÷¡£
2.·¢Õ¹ÀúÊ·£º
ÍøÂç·¢Õ¹³õÆÚ£¬»¨·ÑºÜ¶àʱ¼äѧϰsocketµÄ¸´ÔÓ¡¢Ñ°Ö·µÈ£¬ÔÚC socket¿âÉϽøÐбàÂ룬²¢ÐèÒªÔÚ²»Í¬µÄ²Ù×÷ϵͳÉÏ×ö²»Í¬µÄ´¦Àí¡£ JavaÔçÆÚ°æ±¾£¨1995-2002£©½éÉÜÁË×ã¹»µÄÃæÏò¶ÔÏóµÄÌÇÒÂÀ´Òþ²ØÒ»Ð©¸´ÔÓÐÔ£¬µ«ÊµÏÖ¿Í»§¶Ë-·þÎñÆ÷ÐÒéÈÔÐèÒª´óÁ¿µÄÑù°å´úÂëºÍ´óÁ¿µÄ¼àÊÓ²ÅÄÜÈ·±£ËûÃÇÊǶԵġ£ÔçÆÚµÄAPIÖ»ÄÜͨ¹ýÔÉúµÄsocket¿âÀ´Ö§³ÖËùνµÄ?blocking¹¦ÄÜ¡£
JAVA NIO£¬·Ç×èÈûAPI£¬×èÈûÐÔI/OÒ»°ã¹¤×÷Á÷³ÌÈçͼʾ£º

ÕâÖÖ·½Ê½ÔÚÁ¬½ÓÊý±È½ÏÉÙµÄʱºò»¹ÊÇ¿ÉÒÔ½ÓÊܵ쬵±²¢·¢Á¬½Ó³¬¹ý10000ʱ£¬¿ªÏú»áÃ÷ÏÔÔö¼Ó¡£´ËÍ⣬ÿһ¸öÏØ³Ç¶¼ÓÐÒ»¸öĬÈϵĶÑÕ»ÄÚ´æ·ÖÅäÁË128KºÍ1MÖ®¼äµÄ¿Õ¼ä¡£¿¼Âǵ½ÕûÌåµÄÄÚ´æºÍ²Ù×÷ϵͳÐèÒª´¦Àí¸ü¶àµÄ²¢·¢Á¬½Ó×ÊÔ´£¬ËùÒÔÕâËÆºõ²»ÊÇÒ»¸öÀíÏëµÄ½â¾ö·½°¸¡£
SELECTOR£¬ÊµÏÖJavaµÄÎÞ×èÈûI/OʵÏֵĹؼü£¬¹¤×÷Á÷³ÌÈçÏ£º

×îÖÕÓÉSelector¾ö¶¨ÄÄÒ»×é×¢²áµÄsocket×¼±¸Ö´ÐÐI/O¡£Í¨¹ý֪ͨ£¬Ò»¸öÏØ³Ç¿ÉÒÔͬʱ´¦Àí¶à¸ö²¢·¢Á¬½Ó£¨Ò»¸öSelectorͨ³£ÓÉÒ»¸öÏ̴߳¦Àí£¬µ«¾ßÌåʵʩ¿ÉÒÔʹÓöà¸öỊ̈߳©Òò´Ë£¬Ã¿´Î¶Á»òд²Ù×÷Ö´ÐÐÄÜÁ¢¼´¼ì²éÍê³É¡£¸ÃÄ£ÐÍ¿ÉÒÔÓýÏÉÙµÄÏ̴߳¦Àí¸ü¶àÁ¬½Ó£¬ÕâÒâζ×ÅÔÚÄÚ´æºÍÉÏÏÂÎÄÇл»ÉÏ»°·Ñ¸üÉٵĿªÏú£¬µ±Ã»ÓÐI/O´¦Àíʱ£¬Ï߳̿ÉÒÔ±»Öض¨Ïòµ½ÆäËûÈÎÎñÉÏ¡£ ÎÒÃÇ¿ÉÒÔÊÀ½çʹÓÃJavaAPI¹¹½¨µÄNIO¹¹½¨Ó¦ÓóÌÐò£¬µ«ÕâÑù×öÕýÈ·ºÍ°²È«ÎÞ·¨±£Ö¤£¬ÊµÏÖ¿É¿¿ºÍ¿ÉÀ©Õ¹µÄevent-processing£¨Ê¼þ´¦ÀíÆ÷£©À´´¦ÀíºÍµ÷¶ÈÊý¾Ý²¢±£Ö¤¾¡¿ÉÄÜÓÐЧ£¬²»¹ýÕâÊÇÒ»¸ö·±ËöºÍÈÝÒ׳ö´íµÄÈÎÎñ£¬¶øÕâЩ£¬¾Í½»¸øÁËNetty¡£
3.NettyÌØµã
Éè¼Æ£º Õë¶Ô¶àÖÖ´«ÊäÀàÐ͵Äͬһ½Ó¿Ú-×èÈûºÍ·Ç×èÈû£» ¼òµ¥µ«¸üÇ¿´óµÄÏß³ÌÄ£ÐÍ£» ÕæÕýµÄÎÞÁ¬½ÓµÄÊý¾Ý±¨Ì×½Ó×ÖÖ§³Ö£» Á¬½ÓÂß¼Ö§³Ö¸´ÓᣠÒ×ÓÃÐÔ£º ´óÁ¿µÄjavadocºÍ´úÂëʵÀý£» ³öÁËÔÚJDK1.6+¶îÍâµÄÏÞÖÆ¡£ ÐÔÄÜ£º ±ÈºËÐÄJava API¸üºÃµÄÍÌÍÂÁ¿£¬½ÏµÍµÄÑÓʱ£» ×ÊÔ´ÏûºÄ¸üÉÙ£¬Õâ¸öµÃÒæÓÚÓÚ¹²Ïí³ØºÍÖØÓã» ¼õÉÙÄڴ濽±´¡£ ½¡×³ÐÔ£º Ïû³ýÓÉÓÚÂý¡¢¿ì¡¢»îÖØÔØÁ¬½Ó²úÉúµÄOutOfMemoryError£» Ïû³ý¾³£·¢ÏÖÔÚNIOÔÚ¸æËßÍøÂçÖеÄÓ¦ÓÃÖеIJ»¹«Æ½µÄ¶Á/д±È¡£ °²È«£º ÍêÕûµÄSSL/TLSºÍStartTLSµÄÖ§³Ö£» ÔËÐÐÔÚÊÜÏ޵Ļ·¾³ÀýÈçApplet»îOSGI¡£ ÉçÇø£º ·¢²¼µÄ¸üÔçºÍ¸üƵ·±£» ÉçÇøÇý¶¯¡£
4.Òì²½ºÍʼþÇý¶¯
·Ç×èÈûI/O²»»áÇ¿ÆÈÎÒÃǵȴý²Ù×÷µÄÍê³É¡£
5.¹¹³É²¿·Ö
Channel£ºNIO»ù±¾½á¹¹£¬´ú±íÒ»¸öÓÃÓÚÁ¬½Óµ½ÊµÌåÈçÓ²¼þÉ豸¡¢Îļþ¡¢ÍøÂçÌ×½Ó×Ö»ò³ÌÐò×é¼þ£¬ÄÜ·ñÖ´ÐÐÒ»¸ö»ò¶à¸ö²»Í¬µÄI/O²Ù×÷µÄ¿ª·ÅÁ¬½Ó¡£ Callback£º»Øµ÷·½·¨£¬Ìṩ¸øÁíÒ»ÖÖ·½·¨×÷ΪÒýÓã¬Ê±¼ä½Ó¿Ú¿ÉÓÉChannelHandlerµÄʵÏÖÀ´´¦Àí¡£ Future£ºÌṩÁËÁíÒ»ÖÖ֪ͨӦÓòÙ×÷ÒѾÍê³ÉµÄ·½Ê½£¬Õâ¸ö¶ÔÏó×÷Ϊһ¸öÒ»²½²Ù×÷½á¹ûµÄռλ·û£¬Ëû½«ÔÚ½«À´µÄij¸öʱºòÍê³É²¢Ìá½»½á¹û¡£NettyÌṩ×Ô¼ºµÄʵÏÖ£¬ChannelFuture£¬ÓÃÓÚÖ´ÐÐÒì²½²Ù×÷ʱʹÓá£Ã¿¸öNettyµÄoutbound
I/O²Ù×÷¶¼»á·µ»ØÒ»¸öChannelFuture£¬ÕâÑù¾Í²»»á×èÈû£¬Õâ±ãÊÇNettyËùνµÄ¡°×Ôµ×ÏòÉϵÄÒì²½ºÍʼþÇý¶¯¡±¡£Ïà¹ØÊµÏֵIJ½ÖèÈçÏ£º 1.Òì²½Á¬½Óµ½Ô¶³Ì¶ÔµÈ½Úµã£¬µ÷ÓÃÁ¢¼´·µ»Ø²¢ÌṩChannelFuture£» 2.²Ù×÷Íê³Éºó֪ͨע²áÒ»¸öChannelFutureListener£» 3.µ±operationComplete()µ÷ÓÃʱ¼ì²é²Ù×÷µÄײËû£» 4.Èç¹û³É¹¦¾Í´´½¨Ò»¸öByteBufÀ´±£´æÊý¾Ý£» 5.Òì²½·¢ËÍÊý¾Ýµ½Ô¶³Ì£¬Ôٴηµ»ØChannelFuture£» 6.Èç¹ûÓÐÒ»¸ö´íÎóÔòÅ׳öThrowable£¬ÃèÊö´íÎóÔÒò¡£
EventºÍHandler£ºNettyʹÓò»Í¬µÄʼþÀ´Í¨ÖªÎÒÃǸü¸ÄµÄ״̬»ò²Ù×÷µÄ״̬£¬ÕâʹÎÒÃÇÄܹ»¸ù¾Ý·¢ÉùµÄʼþ´¥·¢Êʵ±µÄÐÐΪ¡£ÕâЩÐÐΪ¿ÉÄܰüÀ¨£ºÈÕÖ¾¡¢Êý¾Ýת»»¡¢Á÷¿ØÖÆ¡¢Ó¦ÓóÌÐòÂß¼£¬ÓÉÓÚNettyÊÇÒ»¸öÍøÂç¿ò¼Ü£¬Ê¼þºÜÇåÎúµÄ¸úÈëÕ»»ò³ö³öÕ¾Êý¾ÝÁ÷Ïà¹Ø£¬ÒòΪһЩʼþ¿ÉÄÜ´¥·¢µÄ´«ÈëµÄÊý¾Ý»ò״̬µÄ±ä»¯°üÀ¨£º»î¶¯»ò·Ç»î¶¯Á¬½Ó¡¢Êý¾ÝµÄ¶ÁÈ¡¡¢Óû§Ê¼þ¡¢´íÎ󣬳öվʼþÊÇÓÉÓÚÔÚδÀ´²Ù×÷½«´¥·¢µÄÒ»¸ö¶¯×÷£¬ÕâЩ°üÀ¨£º´ò¿ª»ò¹Ø±ÕÒ»¸öÁ¬½Óµ½Ô¶³Ì¡¢Ð´»ò³åË¢Êý¾Ýµ½socket¡£Ã¿¸öʼþ¶¼¿ÉÒÔ·ÖÅ䏸Óû§ÊµÏÖ´¦Àí³ÌÐòÀàµÄ·½·¨£¬ÕâЩ·¶Àý¿ÉÖ±½Óת»»ÎªÓ¦ÓóÌÐò¹¹½¨¿é£¬Èçͼ£º

NettyµÄChannelHandlerÊǸ÷ÖÖ´¦Àí³ÌÐòµÄ»ù±¾³éÏó£¬Ã¿¸ö´¦ÀíÆ÷ʵÀý¾ÍÊÇÒ»¸ö»Øµ÷£¬ÓÃÓÚÖ´Ðи÷ÖÖʼþµÄÏìÓ¦¡£
6.ÕûºÏ
FUTURE,CALLBACKºÍHANDLER NettyµÄÒì²½±à³ÌÄ£ÐÍÊǽ¨Á¢ÔÚfutureºÍcallbackµÄ¸ÅÄîÉϵģ¬ËùÓÐÕâÐ©ÔªËØµÄÐͬΪ×Ô¼ºµÄÉè¼ÆÌṩÁËÇ¿´óµÄÁ¦Á¿¡£À¹½Ø²Ù×÷ºÍת»»ÈëÕ¾»ò³öÕ¾Êý¾ÝÖ»ÐèÒªÌṩ»Øµ÷»òÕßÀûÓÃfuture²Ù×÷·µ»ØµÄ£¬ÕâÊÇÓõÄÁ´²Ù×÷¼òµ¥¡¢¸ßУ£¬´Ù½ø±àд¿ÉÖØÓõġ¢Í¨ÓõĴúÂë¡£Ò»¸öNettyµÄÉè¼ÆµÄÖ÷ҪĿ±êÊÇ´Ù½ø¡°¹Ø×¢µã·ÖÀ롱£¬¼´ÎÒÃǵÄÒµÎñÂß¼´ÓÍøÂç»ù´¡ÉèʩӦÓóÌÐòÖзÖÀë¡£
SELECTOR,EVENTºÍEVENT LOOP Nettyͨ¹ý´¥·¢Ê¼þ´ÓÓ¦ÓóÌÐòÖгéÏó³öSelector£¬´Ó¶ø±ÜÃâÊÖдµ÷¶È´úÂ룬EventLoop·ÖÅä¸øÃ¿¸öChannelÀ´´¦ÀíËùÓеÄʼþ£¬°üÀ¨£º×¢²á¸ÐÐËȤµÄʼþ¡¢µ÷¶Èʼþµ½ChannelHandler¡¢°²ÅŽøÒ»²½Ðж¯¡£¸ÃEventLoop±¾ÉíÓÉÖ»ÓÐÒ»¸öÏß³ÌÇý¶¯£¬Ëü¸øÒ»¸öChannel´¦ÀíËùÓеÄI/Oʼþ£¬²¢ÇÒÔÚEventLoopµÄÉúÃüÖÜÆÚÄÚ²»»á¸Ä±ä£¬Õâ¸ö¼òµ¥¶øÇ¿´óµÄÏß³ÌÄ£ÐÍÏû³ýÄã¿ÉÄܶÔÄãµÄChannelHandlerͬ²½µÄÈκιØ×¢£¬ÕâÑùÄã¾Í¿ÉÒÔרעÌṩÕýÈ·µÄ»Øµ÷Âß¼À´Ö´ÐС£?
7.µÚÒ»¸öNettyÓ¦ÓÃ
7.1Netty¿Í»§¶Ë/·þÎñÆ÷×ÜÀÀ£¬Echo client/server

ͼÖÐÏÔʾÁËÁ¬½Óµ½·þÎñÆ÷µÄ¶à¸ö²¢·¢¿Í»§¶Ë£¬ÀíÂÛÉÏ£¬¿Í»§¶Ë¿ÉÒÔÖ§³ÖµÄÁ¬½ÓÊýÖ»ÊÜÏÞÓÚʹÓõÄJDK°æ±¾ÖеÄÖÆÔ¼¡£
echo£¨»ØÉù£©¿Í»§¶ËºÍ·þÎñÆ÷Ö®¼äµÄ½»»¥ÊǺܼòµ¥µÄ£º¿Í»§¶ËÆô¶¯ºó£¬½¨Á¢Ò»¸öÁ¬½Ó·¢ËÍÒ»¸ö»ò¶à¸öÏûÏ¢µ½·þÎñÆ÷£¬ÆäÖÐÿÏàºôÓ¦ÏûÏ¢·µ»Ø¸ø¿Í»§¶Ë¡£Õâ¸öÓ¦ÓóÌÐò²¢²»ÊǷdz£ÓÐÓ㬵«ÕâÏ×÷ÊÇΪÁ˸üºÃµÄÀí½âÇëÇó--ÏàÓ¦½»»¥±¾Éí£¬ÕâÊÇÒ»¸ö»ù±¾µÄģʽµÄ¿Í»§¶Ë/·þÎñÆ÷ϵͳ¡£
7.2 дһ¸öecho·þÎñÆ÷
NettyʵÏÖµÄecho·þÎñÆ÷ÐèÒªÏÂÃæÄÚÈÝ£º Ò»¸ö·þÎñÆ÷handler£º¸Ã×é¼þʵÏÖÁË·þÎñÆ÷µÄÒµÎñÂß¼£¬¾ö¶¨ÁËÁ¬½Ó´´½¨ºóºÍ½ÓÊܵ½ÐÅÏ¢ºóÈçºÎ´¦Àí£» Bootstrapping£ºÕâ¸öÅäÖ÷þÎñÆ÷µÄÆô¶¯´úÂ룬×îÉÙÐèÒªÉèÖ÷þÎñÆ÷°ó¶¨µÄ¶Ë¿Ú£¬ÓÃÀ´¼àÌýÁ¬½ÓÇëÇó¡£
ͨ¹ýChannelHandlerÀ´ÊµÏÖ·þÎñÆ÷µÄÂß¼£¬Ê¹ÓÃChannelHandlerµÄ·½Ê½ÌåÏÖÁË¡°¹Ø×¢µã·ÖÀ롱µÄÉè¼ÆÔÔò£¬²¢¼ò»¯ÒµÎñÂß¼µÄµü´ú¿ª·¢µÄÒªÇ󣬴¦Àí³ÌÐòºÜ¼òµ¥£¬Ã¿Ò»¸ö·½·¨¶¼¿ÉÒÔ¸²¸Çµ½¡°hook£¨¹³×Ó£©¡±ÔڻÖÜÆÚÊʵ±µÄµã¡£ÀμÇÁ½µã£º ChannelHandlerÊǸø²»Í¬ÀàÐ͵Äʼþµ÷Óã» Ó¦ÓóÌÐòʵÏÖ»òÀ©Õ¹ChannelHandler¹Ò½Óµ½Ê¼þÉúÃüÖÜÆÚºÍÌṩ×Ô¶¨ÒåÓ¦ÓÃÂß¼¡£
Echo server½«½ÓÊܵ½µÄÊý¾Ý¿½±´·¢Ë͸ø¿Í»§¶Ë£¬Òò´Ë£¬ÎÒÃÇÐèҪʵÏÖChannelInboundHandler½Ó¿Ú£¬ÓÃÓÚ×Ô¶¨Òå´¦ÀíÈëվʼþµÄ·½·¨£¬µ±Ç°Ó¦Óüòµ¥£¬Ö»Ðè¼Ì³ÐChannelInboundHandlerAdapter¾ÍÐÐÁË£¬¸ÃÀàÌṩÁËĬÈÏChannelInboundHandlerµÄʵÏÖ£¬ËùÒÔÖ»Ð踲¸ÇÒÔÏ·½·¨£º
channelRead()--ÿ¸öÐÅÏ¢ÈëÕ¾¶¼»áµ÷Ó㬸²¸Ç¸Ã·½·¨ÊÇÒòΪÎÒÃÇÐèÒª´¦ÀíËùÓнÓÊÕµ½µÄÊý¾Ý£»
channelReadComplete()--֪ͨ´¦ÀíÆ÷×îºóµÄchannelRead()Êǵ±Ç°´¦ÀíÖеÄ×îºóÒ»ÌõÏûÏ¢µ÷Óã» exceptionCaught()-¶Á²Ù×÷ʱ²¶»ñµ½Ò쳣ʱµ÷Ó㬸²¸Ç¸Ã·½·¨Ê¹ÎÒÃÇÄܹ»Ó¦¶ÔÈκÎThrowableµÄ×ÓÀà
? ÐÍ£¬ÔÚÕâÖÖÇé¿öÏÂÎÒÃǼǼ¡¢²¢¹Ø±ÕËùÓпÉÄÜ´¦ÔÚδ֪״̬µÄÁ¬½Ó£¬Ëüͨ³£ÊÇÄÑÒÔ´ÓÁ¬½Ó´íÎóÖлָ´£¬ËùÒÔ¸É´à¹Ø±ÕÔ¶³ÌÁ¬½Ó£¬µ±È»£¬Ò²ÓпÉÄܵÄÇé¿öÊÇ¿ÉÒÔ´Ó´íÎóÖлָ´µÄ£¬ËùÒÔ¿ÉÒÔÓÃÒ»¸ö¸ü¸´ÔӵĴëÊ©À´³¢ÊÔʶ±ðºÍ´¦ÀíÕâÑùµÄÇé¿ö¡£Ã¿¸öChannel¶¼ÓÐÒ»¸ö¹ØÁªµÄChannelPipeline£¬Ëü´ú±íÁËChannelHandlerʵÀýµÄÁ´£¬ÊÊÅäÆ÷´¦ÀíµÄʵÏÖ֪ʶ½²Ò»¸ö´¦Àí·½·¨µ÷ÓÃת·¢µ½Á´ÖеÄÏÂÒ»¸ö´¦ÀíÆ÷£¬Òò´Ë£¬Èç¹ûÒ»¸öNettyÓ¦ÓóÌÐò²»¸²¸ÇexceptionCaught£¬ÄÇôÕâЩ´íÎó×îÖÕ½«µ½´ïChannelPipeline£¬²¢ÇÒ½áÊø¾¯¸æ½«±»¼Ç¼¡£
ʹÓù¤¾ßIntelliJ IDEA 2017.2.3¹¤¾ß´´½¨MavenÏîÄ¿£¬ÃüÃûΪechoserver,pom.xmlÄÚÈÝÈçÏÂ
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com</groupId> <artifactId>echo-server</artifactId>
<version>1.0-SNAPSHOT</version>
<name>echo-server</name>
<dependencies> <!-- https://mvnrepository.com/artifact/io.netty/netty-all
--> <dependency> <groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.33.Final</version>
</dependency> </dependencies>
</project>
|
´´½¨ÒµÎñºËÐÄ´¦ÀíÂß¼EchoServerHandler£¬ÄÚÈÝÓë×¢ÊÍÈçÏ£º
package com;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.CharsetUtil;
@ChannelHandler.Sharable //1.±êÖ¾ÕâÀàµÄʵÀýÖ®¼ä¿ÉÒÔÔÙchannelÀïÃæ¹²Ïí
public class EchoServerHandler extends ChannelInboundHandlerAdapter
{
@Override
public void channelRead(ChannelHandlerContext
ctx, Object msg) throws Exception {
ByteBuf in = (ByteBuf)msg;
System.out.println("Server received:"+in.toString(CharsetUtil.UTF_8));//2.ÈÕÖ¾Êä³öµ½¿ØÖÆÌ¨
ctx.write(in);//3.½«Ëù½ÓÊÕµÄÏûÏ¢·µ»Ø¸ø·¢ËÍÕߣ¬×¢Ò⣬´Ëʱ»¹Ã»ÓгåË¢Êý¾Ý
}
@Override
public void channelReadComplete(ChannelHandlerContext
ctx) throws Exception {
ctx.writeAndFlush(Unpooled.EMPTY_BUFFER)//4.³åË¢ËùÓдýÉóÏûÏ¢µ½Ô¶³Ì½Úµã£¬¹Ø±ÕͨµÀºó£¬²Ù×÷Íê³É
.addListener(ChannelFutureListener.CLOSE);
}
@Override
public void exceptionCaught(ChannelHandlerContext
ctx, Throwable cause) throws Exception {
ctx.fireExceptionCaught(cause);//5.´òÓ¡Òì³£¶ÑÕ»¸ú×Ù
ctx.close();//6.¹Ø±ÕͨµÀ
}
}
|
´´½¨ÍêÒµÎñºËÐÄ´¦ÀíÂß¼Ö®ºó£¬´´½¨Òýµ¼·þÎñÆ÷EchoServer£¬×÷ÓÃÈçÏ£º
¼àÌýºÍ½ÓÊÕ½øÀ´µÄÁ¬½ÓÇëÇó£» ÅäÖÃChannelÀ´Í¨ÖªÒ»¸ö¹ØÓÚÈëÕ¾ÏûÏ¢µÄEchoServerHandlerʵÀý¡£
ÄÚÈÝÈçÏ£º
package com;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import java.net.InetSocketAddress;
public class EchoServer {
private final int port;
public EchoServer(int port) {
this.port = port;
}
public static void main(String[] args) throws
Exception{
// if(args.length != 1){
// System.err.println("Usage: " + EchoServer.class.getSimpleName()
+ "<port>");
// return;
// }
// int port = Integer.parseInt(args[0]);//1.ÉèÖö˿ÚÖµ
int port = 8990;//1.ÉèÖö˿ÚÖµ
new EchoServer(port).start();//2.Æô¶¯·þÎñ
}
public void start() throws Exception{
EventLoopGroup group = new NioEventLoopGroup();//3.´´½¨EventLoopGroup£¬Ò»¸öÏß³Ì
try {
ServerBootstrap b = new ServerBootstrap();
b.group(group)//4.´´½¨ServerBootstrap£¬´Ë´¦Ò²¿É·ÅÈë¶à¸öEventLoopGroup
.channel(NioServerSocketChannel.class)//5.Ö¸¶¨Ê¹ÓÃNIOµÄ´«ÊäChannel£¬Ö¸¶¨ÐŵÀÀàÐÍ
.localAddress(new InetSocketAddress(port))//6.ÉèÖÃsocketµØÖ·Ê¹ÓÃËùÑ¡¶Ë¿Ú
.childHandler(new ChannelInitializer<SocketChannel>()
{//7.µ±ÓÐÒ»¸öеÄÁ¬½Ó±»½ÓÊÜ£¬Ò»¸öеÄ×ÓChannel½«±»´´½¨£¬ChannelInitializerÌí¼ÓEchoServerHandlerµ½ChannelµÄChannelPipeline£¬
@Override
public void initChannel(SocketChannel ch) throws
Exception{
ch.pipeline().addLast(
new EchoServerHandler());
}
});
ChannelFuture f = b.bind().sync();//8.°ó¶¨µÄ·þÎñÆ÷£¬syncµÈ´ý·þÎñÆ÷¹Ø±Õ£¬µ÷ÓÃsync()µÄÔÒòÊǵ±Ç°Ïß³Ì×èÈû
System.out.println(EchoServer.class.getName()
+ " started and listen on " + f.channel().localAddress());
f.channel().closeFuture().sync();//9.¹Ø±ÕChannelºÍ¿é
} finally {
group.shutdownGracefully().sync();//10.¹Ø±ÕEventLoopGroup£¬ÊÍ·ÅËùÓÐ×ÊÔ´
}
}
}
|
·þÎñÆ÷µÄÖ÷´úÂë×é¼þÊÇ£ºEchoServerHandlerʵÏÖÁ˵ÄÒµÎñÂß¼¡¢ÔÚmain()·½·¨ÖÐÒýµ¼ÁË·þÎñÆ÷¡£
Ö´ÐÐÒýµ¼·þÎñÆ÷ËùÐèµÄ²½ÖèÊÇ£º
´´½¨ServerBootstrapʵÀýÒýµ¼·þÎñÆ÷²¢Ëæºó°ó¶¨£»
´´½¨²¢·ÖÅäÒ»¸öNioEventLoopGroupʵÀýÀ´ÊÐÀïʼþµÄ´¦Àí£¬Èç½ÓÊÜеÄÁ¬½ÓºÍ¶Á/дÊý¾Ý£»
Ö¸¶¨±¾µØInetSocketAddress¸ø·þÎñÆ÷°ó¶¨£»? ͨ¹ýEchoServerHandlerʵÀý¸øÃ¿Ò»¸öеÄChannel³õʼ»¯£» ×îºóµ÷ÓÃServerBootstrap.bind()°ó¶¨·þÎñÆ÷¡£
7.3 дһ¸öecho¿Í»§¶Ë
¿Í»§¶ËÒª×öµÄ¾ÍÊÇ£º Á¬½Ó·þÎñÆ÷£» ·¢ËÍÐÅÏ¢£» ·¢Ë͵Äÿ¸öÐÅÏ¢£¬µÈ´ýºÍ½ÓÊÜ´Ó·þÎñÆ÷·µ»ØµÄͬÑùµÄÐÅÏ¢£» ¹Ø±ÕÁ¬½Ó¡£
ÓÃChannelHandlerʵÏÖ¿Í»§¶ËÂß¼
¸úд·þÎñÆ÷Ò»Ñù£¬NettyÌṩÁËChannelInboundHandlerÀ´´¦ÀíÊý¾Ý£¬ÏÂÃæµÄÀý×ÓÖУ¬ÎÒÃÇʹÓÃSimpleChannelInboundHandlerÀ´´¦ÀíËùÓеÄÈÎÎñ£¬ÐèÒª¸²¸ÇÈý¸ö·½·¨£º channelActive()--·þÎñÆ÷µÄÁ¬½Ó±»½¨Á¢ºóµ÷Óã¬Ò»µ©½¨Á¢ÁËÁ¬½Ó£¬×Ö½ÚÐòÁб»·¢Ë͵½·þÎñÆ÷£» channelRead0()--ÔÚ½ÓÊÕµ½Êý¾Ýʱ±»µ÷Óã¬ÓÉ·þÎñÆ÷Ëù·¢Ë͵ÄÏûÏ¢¿ÉÒÔÒÔ¿éµÄÐÎʽ±»½ÓÊÕ¡£¼´£¬µ±·þÎñÆ÷·¢ËÍÎå¸ö×Ö½ÚÊDz»ÊDZ£Ö¤ËùÓеÄ5¸ö×Ö½Ú»áÁ¢¿ÌÊÕµ½£¬¼´Ê¹Ö»ÓÐ5¸ö×Ö½Ú£¬channelRead0()·½·¨¿É±»µ÷ÓÃÁ½´Î£¬µÚÒ»´ÎÓÃÒ»¸öByteBuf×°ÔØ3¸ö×ֽں͵ڶþ´ÎÒ»¸öByteBuf×°ÔØ2¸ö×Ö½Ú£¬Î¨Ò»Òª±£Ö¤µÄÊÇ£¬¸Ã×Ö½Ú½«°´ÕÕËûÃÇ·¢Ë͵Ä˳Ðò·Ö±ð±»½ÓÊÕ£» exceptionCaught()--²¶»ñÒ»¸öÒ쳣ʱµ÷Óá£
´´½¨MavenÏîÄ¿£¬ÃüÃûechoclient£¬pom.xmlÎļþÄÚÈÝÈçÏÂ
<?xml version="1.0"
encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com</groupId> <artifactId>echo-client</artifactId>
<version>1.0-SNAPSHOT</version>
<name>echo-client</name>
<dependencies> <!-- https://mvnrepository.com/artifact/io.netty/netty-all
--> <dependency> <groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.33.Final</version>
</dependency> </dependencies>
</project>
|
´´½¨EchoClientHandler.java,ÄÚÈÝÈçÏÂ
package com;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.util.CharsetUtil;
@ChannelHandler.Sharable//1.±ê¼ÇÕâ¸öÀàµÄʵÀý¿ÉÒÔÔÚ channel
Àï¹²Ïí
public class EchoClientHandler extends SimpleChannelInboundHandler<ByteBuf>
{
@Override
public void channelActive(ChannelHandlerContext
ctx){
ctx.writeAndFlush(Unpooled.copiedBuffer("Netty
rocks!", //2.µ±±»Í¨Öª¸Ã channel ÊǻµÄʱºò¾Í·¢ËÍÐÅÏ¢
CharsetUtil.UTF_8));
}
@Override
public void channelRead0(ChannelHandlerContext
ctx, ByteBuf in) throws Exception {
System.out.println("Client received: "
+ in.toString(CharsetUtil.UTF_8));//3.´òÓ¡½ÓÊÕµ½µÄÐÅÏ¢
}
@Override
public void exceptionCaught(ChannelHandlerContext
ctx, Throwable cause) throws Exception {
cause.printStackTrace();//4.´òÓ¡Òì³£¶ÑÕ»¸ú×Ù
ctx.close();//5.¹Ø±ÕͨµÀ
}
}
|
´´½¨Òýµ¼¿Í»§¶ËEchoClient£¬ÐèÒªhost¡¢portÁ½¸ö²ÎÊýÁ¬½Ó·þÎñÆ÷£¬ÄÚÈÝÈçÏÂ
package com;
import io.netty.bootstrap.Bootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import java.net.InetSocketAddress;
public class EchoClient {
private final String host;
private final int port;
public EchoClient(String host, int port) {
this.host = host;
this.port = port;
}
public void start()throws Exception{
EventLoopGroup group = new NioEventLoopGroup();
try {
Bootstrap b = new Bootstrap();//1.´´½¨Bootstrap
b.group(group)//2.Ö¸¶¨EventLoopGroupÀ´´¦Àí¿Í»§¶Ëʼþ£¬ÓÉÓÚÎÒÃÇNIO´«Ê䣬ËùÒÔÓõ½ÁËNioEventLoopGroupµÄʵÏÖ
.channel(NioSocketChannel.class)//3.ʹÓõÄChannelÀàÐÍÊÇÒ»¸öÓÃÓÚNIO´«Ê䣬Ҳ¿ÉÒÔʹÓúͷþÎñÆ÷²»Ò»ÑùµÄÀàÐÍ
.remoteAddress(new InetSocketAddress(host, port))//4.ÉèÖ÷þÎñÆ÷µÄInetSocketAddress
.handler(new ChannelInitializer<SocketChannel>()
{//5.µ±½¨Á¢Ò»¸öÁ¬½ÓºÍÒ»¸öеÄͨµÀʱ£¬´´½¨Ìí¼Óµ½ EchoClientHandler ʵÀý
µ½ channelpipeline
@Override
public void initChannel(SocketChannel ch)throws
Exception{
ch.pipeline().addLast(new EchoClientHandler());
}
});
ChannelFuture f = b.connect().sync();//6.Á¬½Óµ½Ô¶³Ì£¬µÈ´ýÁ¬½ÓÍê³É
f.channel().closeFuture().sync();//7.×èÈûÖ±µ½Channel¹Ø±Õ
} finally {
group.shutdownGracefully().sync();//8.µ÷ÓÃshutdownGracefullyÀ´¹Ø±ÕÏ̳߳غÍÊÍ·ÅËùÓÐ×ÊÔ´
}
}
public static void main(String[] args)throws Exception{
// if(args.length != 2){
// System.err.println("Usage: " + EchoClient.class.getSimpleName()
+ "<host> <port>");
// return;
// }
// final String host = args[0];
// final int port = Integer.parseInt(args[1]);
final String host = "localhost";
final int port = 8990;
new EchoClient(host,port).start();
}
}
|
Æô¶¯Echo·þÎñ¶Ë£¬Ö±½ÓÔËÐÐmain()·½·¨£¬¿ØÖÆÌ¨´òÓ¡ÈçÏ£º

Æô¶¯Echo¿Í»§¶Ë£¬Ö±½ÓÔËÐÐmain()·½·¨£¬¿ØÖÆÌ¨´òÓ¡ÈçÏ£º

¶øÔÚÕâ֮ǰµÄ·þÎñ¶Ë¿ØÖÆÌ¨Ôò»á´òÓ¡ÈçÏÂÓï¾ä£º

ÖÁ´ËÒ»¸ö¼òµ¥µÄNettyÓ¦ÓôÍê³É. |