Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
Netty¿ò¼Üѧϰ¼°µÚÒ»¸öNettyÓ¦ÓÃ
 
  26349  次浏览      31
 2019-9-18 
 
±à¼­ÍƼö:

±¾ÎÄÀ´×ÔÓÚ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Ó¦ÓôÍê³É.

   
26349 ´Îä¯ÀÀ       31
Ïà¹ØÎÄÕÂ

Java΢·þÎñÐÂÉú´úÖ®Nacos
ÉîÈëÀí½âJavaÖеÄÈÝÆ÷
JavaÈÝÆ÷Ïê½â
Java´úÂëÖÊÁ¿¼ì²é¹¤¾ß¼°Ê¹Óð¸Àý
Ïà¹ØÎĵµ

JavaÐÔÄÜÓÅ»¯
Spring¿ò¼Ü
SSM¿ò¼Ü¼òµ¥¼òÉÜ
´ÓÁ㿪ʼѧjava±à³Ì¾­µä
Ïà¹Ø¿Î³Ì

¸ßÐÔÄÜJava±à³ÌÓëϵͳÐÔÄÜÓÅ»¯
JavaEE¼Ü¹¹¡¢ Éè¼ÆÄ£Ê½¼°ÐÔÄܵ÷ÓÅ
Java±à³Ì»ù´¡µ½Ó¦Óÿª·¢
JAVAÐéÄâ»úÔ­ÀíÆÊÎö