NettyΪÐí¶àͨÓÃÐÒéÌṩÁ˱à½âÂëÆ÷ºÍ´¦ÀíÆ÷£¬¼¸ºõ¿ÉÒÔ¿ªÏä¼´Óã¬Õâ¼õÉÙÁËÄãÔÚÄÇЩÏ൱·±ËöµÄÊÂÎñÉϱ¾À´»á»¨·ÑµÄʱ¼äÓ뾫Á¦¡£ÎÒÃǽ«Ì½ÌÖÕâЩ¹¤¾ßÒÔ¼°ËüÃÇËù´øÀ´µÄºÃ´¦£¬ÆäÖаüÀ¨Netty¶ÔÓÚSSL/TLSºÍWebSocketµÄÖ§³Ö£¬ÒÔ¼°ÈçºÎ¼òµ¥µØͨ¹ýÊý¾ÝѹËõÀ´Ñ¹Õ¥HTTP£¬ÒÔ»ñÈ¡¸üºÃµÄÐÔÄÜ¡£
1¡¢Í¨¹ýSSL/TLS±£»¤NettyÓ¦ÓóÌÐò
SSLºÍTLSÕâÑùµÄ°²È«ÐÒ飬ËüÃDzãµþÔÚÆäËûÐÒéÖ®ÉÏ£¬ÓÃÒÔʵÏÖÊý¾Ý°²È«¡£ÎÒÃÇÔÚ·ÃÎÊ°²È«ÍøվʱÓöµ½¹ýÕâЩÐÒ飬µ«ÊÇËüÃÇÒ²¿ÉÓÃÓÚÆäËû²»ÊÇ»ùÓÚHTTPµÄÓ¦ÓóÌÐò£¬È簲ȫSMTP£¨SMTPS£©Óʼþ·þÎñÆ÷ÉõÖÁÊǹØϵÐÍÊý¾Ý¿âϵͳ¡£
ÏÂͼչʾÁËʹÓÃSslHandlerµÄÊý¾ÝÁ÷ÒÔÏ´úÂëչʾÁËÈçºÎʹÓÃChannelInitializerÀ´½«SslHandlerÌí¼Óµ½ChannelPipelineÖС£
ÔÚ´ó¶àÊýÇé¿öÏ£¬SslHandler½«ÊÇChannelPipelineÖеĵÚÒ»¸öChannelHandler¡£ÕâÈ·±£ÁËÖ»ÓÐÔÚËùÓÐÆäËûµÄChannelHandler½«ËüÃǵÄÂß¼Ó¦Óõ½Êý¾ÝÖ®ºó£¬²Å»á½øÐмÓÃÜ¡£
ÀýÈ磬ÔÚÎÕÊֽ׶Σ¬Á½¸ö½Úµã½«Ï໥ÑéÖ¤²¢ÇÒÉ̶¨Ò»ÖÖ¼ÓÃÜ·½Ê½¡£Äã¿ÉÒÔͨ¹ýÅäÖÃSslHandlerÀ´ÐÞ¸ÄËüµÄÐÐΪ£¬»òÕßÔÚSSL/TLSÎÕÊÖÒ»µ©Íê³ÉÖ®ºóÌṩ֪ͨ£¬ÎÕÊֽ׶ÎÍê³ÉÖ®ºó£¬ËùÓеÄÊý¾Ý¶¼½«»á±»¼ÓÃÜ¡£SSL/TLSÎÕÊÖ½«»á±»×Ô¶¯Ö´ÐС£
2¡¢¹¹½¨»ùÓÚNettyµÄHTTP/HTTPSÓ¦ÓóÌÐò
HTTP/HTTPSÊÇ×î³£¼ûµÄÐÒéÌ×¼þÖ®Ò»£¬²¢ÇÒËæ×ÅÖÇÄÜÊÖ»úµÄ³É¹¦£¬ËüµÄÓ¦ÓÃÒ²ÈÕÒæ¹ã·º£¬ÒòΪ¶ÔÓÚÈκι«Ë¾À´Ëµ£¬ÓµÓÐÒ»¸ö¿ÉÒÔ±»Òƶ¯É豸·ÃÎʵÄÍøÕ¾¼¸ºõÊDZØÐëµÄ¡£ÕâЩÐÒéÒ²±»ÓÃÓÚÆäËû·½Ãæ¡£
HTTPÊÇ»ùÓÚÇëÇó/ÏìӦģʽµÄ£º¿Í»§¶ËÏò·þÎñÆ÷·¢ËÍÒ»¸öHTTPÇëÇó£¬È»ºó·þÎñÆ÷½«»á·µ»ØÒ»¸öHTTPÏìÓ¦¡£NettyÌṩÁ˶àÖÖ±àÂëÆ÷ºÍ½âÂëÆ÷ÒÔ¼ò»¯¶ÔÕâ¸öÐÒéµÄʹÓá£
ÏÂͼ·Ö±ðչʾÁËÉú²úºÍÏû·ÑHTTPÇëÇóºÍHTTPÏìÓ¦µÄ·½·¨¡£
ÕýÈçÉÏͼËùʾ£¬Ò»¸öHTTPÇëÇó/ÏìÓ¦¿ÉÄÜÓɶà¸öÊý¾Ý²¿·Ö×é³É£¬²¢ÇÒËü×ÜÊÇÒÔÒ»¸öLastHttpContent²¿·Ö×÷Ϊ½áÊø¡£FullHttpRequestºÍFullHttpResponseÏûÏ¢ÊÇÌØÊâµÄ×ÓÀàÐÍ£¬·Ö±ð´ú±íÁËÍêÕûµÄÇëÇóºÍÏìÓ¦¡£ËùÓÐÀàÐ͵ÄHTTPÏûÏ¢¶¼ÊµÏÖHttpObject½Ó¿Ú¡£
ÒÔÏ´úÂëÖеÄHttpPipelineInitializerÀàչʾÁ˽«HTTPÖ§³ÖÌí¼Óµ½ÄãµÄÓ¦ÓóÌÐòʱ¶àô¼òµ¥¡ª¡ª¼¸ºõÖ»ÐèÒª½«ÕýÈ·µÄChannelHandlerÌí¼Óµ½ChannelPipelineÖС£
3¡¢¾ÛºÏHTTPÏûÏ¢
ÔÚChannelInitializer½«ChannelHandler°²×°µ½ChannelPipelineÖÐÖ®ºó£¬Äã±ã¿ÉÒÔ´¦Àí²»Í¬ÀàÐ͵ÄHttpObjectÏûÏ¢ÁË¡£µ«ÊÇÓÉÓÚHTTPµÄÇëÇóºÍÏìÓ¦¿ÉÄÜÓÉÐí¶à²¿·Ö×é³É£¬Òò´ËÄãÐèÒª¾ÛºÏËüÃÇÒÔÐγÉÍêÕûµÄÏûÏ¢¡£ÎªÁËÏû³ýÕâÏî·±ËöµÄÈÎÎñ£¬NettyÌṩÁËÒ»¸ö¾ÛºÏÆ÷£¬Ëü¿ÉÒÔ½«¶à¸öÏûÏ¢²¿·ÖºÏ²¢ÎªFullHttpRequest»òÕßFullHttpResponseÏûÏ¢¡£Í¨¹ýÕâÑùµÄ·½Ê½£¬Ä㽫×ÜÊÇ¿´µ½ÍêÕûµÄÏûÏ¢ÄÚÈÝ¡£
ÓÉÓÚÏûÏ¢·Ö¶ÎÐèÒª±»»º³å£¬Ö±µ½¿ÉÒÔת·¢Ò»¸öÍêÕûµÄÏûÏ¢¸øÏÂÒ»¸öChannelInboundHandler£¬ËùÒÔÕâ¸ö²Ù×÷ÓÐÇá΢µÄ¿ªÏú¡£ÆäËù´øÀ´µÄºÃ´¦±ãÊÇÄã²»±Ø¹ØÐÄÏûÏ¢ËéƬÁË¡£
ÒýÈëÕâÖÖ×Ô¶¯¾ÛºÏ»úÖÆÖ»²»¹ýÊÇÏòChannelPipelineÖÐÌí¼ÓÁíÍâÒ»¸öChannelHandler°ÕÁË¡£ÈçÒÔÏ´úÂëËùʾ¡£
4¡¢HTTPѹËõ
µ±Ê¹ÓÃHTTPʱ£¬½¨Ò鿪ÆôѹËõ¹¦ÄÜÒÔ¾¡¿ÉÄܶàµØ¼õÉÙ´«ÊäÊý¾ÝµÄ´óС¡£ËäȻѹËõ»á´øÀ´Ò»Ð©CPUʱÖÓÖÜÆÚÉϵĿªÏú£¬µ«ÊÇͨ³£À´ËµËü¶¼ÊÇÒ»¸öºÃÖ÷Ò⣬ÌرðÊǶÔÓÚÎı¾Êý¾ÝÀ´Ëµ¡£
NettyΪѹËõºÍ½âѹËõÌṩÁËChannelHandlerʵÏÖ£¬ËüÃÇͬʱ֧³ÖgzipºÍdeflate±àÂë¡£
HTTPÇëÇóµÄÍ·²¿ÐÅÏ¢£¬¿Í»§¶Ë¿ÉÒÔͨ¹ýÌṩÒÔÏÂÍ·²¿ÐÅÏ¢À´Ö¸Ê¾·þÎñÆ÷ËüËùÖ§³ÖµÄѹËõ¸ñʽ£º
Get /encrypted-area HTTP/1.1
Accept-Encoding:gzip,deflate
È»¶ø£¬ÐèҪעÒâµÄÊÇ£¬·þÎñÆ÷ûÓÐÒåÎñѹËõËüËù·¢Ë͵ÄÊý¾Ý¡£
ÒÔÏ´úÂëչʾÁËÒ»¸öÀý×Ó¡£
5¡¢Ê¹ÓÃHTTPS
ÒÔÏ´úÂëÏÔʾ£¬ÆôÓÃHTTPSÖ»ÐèÒª½«SslHandlerÌí¼Óµ½ChannelPipelineµÄChannelHandler×éºÏÖС£
ÒÔÉÏÀý×Ó£¬ËµÃ÷ÁËNettyµÄ¼Ü¹¹·½Ê½ÊÇÈçºÎ½«´úÂëÖØÓñäΪ¸Ü¸Ë×÷Óõġ£Ö»ÐèÒª¼òµ¥µØ½«Ò»¸öChannelHandlerÌí¼Óµ½ChannelPipelineÖУ¬±ã¿ÉÒÔÌṩһÏîÐµĹ¦ÄÜ£¬ÉõÖÁÏñ¼ÓÃÜÕâÑùÖØÒªµÄ¹¦Äܶ¼ÄÜÌṩ¡£
6¡¢WebSocket
WebSocket½â¾öÁËÒ»¸ö³¤ÆÚ´æÔÚµÄÎÊÌ⣺¼ÈÈ»µ×²ãµÄÐÒ飨HTTP£©ÊÇÒ»¸öÇëÇó/ÏìӦģʽµÄ½»»¥ÐòÁУ¬ÄÇôÈçºÎʵʱµØ·¢²¼ÐÅÏ¢£¿AJAXÌṩÁËÒ»¶¨³Ì¶ÈÉϵĸÄÉÆ£¬µ«ÊÇÊý¾ÝÁ÷ÈÔÈ»ÊÇÓÉ¿Í»§¶ËËù·¢Ë͵ÄÇëÇóÇý¶¯¡£
WebSocket¹æ·¶ÒÔ¼°ËüµÄʵÏÖ´ú±íÁ˶ÔÒ»ÖÖ¸ü¼ÓÓÐЧµÄ½â¾ö·½°¸µÄ³¢ÊÔ¡£¼òµ¥µØ˵£¬WebSocketÌṩÁË¡°ÔÚÒ»¸öµ¥¸öµÄTCPÁ¬½ÓÉÏÌṩ˫ÏòµÄͨÐÅ¡¤¡¤¡¤¡¤¡¤¡¤¡¤½áºÏWebSocketAPI¡¤¡¤¡¤¡¤¡¤ËüΪÍøÒ³ºÍÔ¶³Ì·þÎñÆ÷Ö®¼äµÄË«ÏòͨÐÅÌṩÁËÒ»ÖÖÌæ´úHTTPÂÖѯµÄ·½°¸¡£¡±
WebSocketÔÚ¿Í»§¶ËºÍ·þÎñÆ÷Ö®¼äÌṩÁËÕæÕýµÄË«ÏòÊý¾Ý½»»»¡£WebSocketÏÖÔÚ¿ÉÒÔÓÃÓÚ´«ÊäÈÎÒâÀàÐ͵ÄÊý¾Ý£¬ºÜÏñÆÕͨµÄÌ×½Ó×Ö¡£
ÏÂͼ¸ø³öÁËWebSocketÐÒéµÄÒ»°ã¸ÅÄî¡£ÔÚÕâ¸ö³¡¾°Ï£¬Í¨ÐŽ«×÷ΪÆÕͨµÄHTTPÐÒ鿪ʼ£¬ËæºóÉý¼¶µ½Ë«ÏòµÄWebSocketÐÒé¡£
ÒªÏëÏòÄãµÄÓ¦ÓóÌÐòÖÐÌí¼Ó¶ÔÓÚWebSocketµÄÖ§³Ö£¬ÄãÐèÒª½«Êʵ±µÄ¿Í»§¶Ë»òÕß·þÎñÆ÷WebSocket ChannelHandlerÌí¼Óµ½ChannelPipelineÖС£Õâ¸öÀཫ´¦ÀíÓÉWebSocket¶¨ÒåµÄ³ÆΪ֡µÄÌØÊâÏûÏ¢ÀàÐÍ¡£
ÒòΪNettyÖ÷ÒªÊÇÒ»ÖÖ·þÎñÆ÷¶ËµÄ¼¼Êõ£¬ËùÒÔÔÚÕâÀïÎÒÃÇÖص㴴½¨WebSocket·þÎñÆ÷¡£´úÂëÈçÏÂËùʾ£¬Õâ¸öÀà´¦ÀíÐÒéÉý¼¶ÎÕÊÖ£¬ÒÔ¼°3ÖÖ¿ØÖÆÖ¡¡ª¡ªClose¡¢PingºÍPong¡£TextºÍBinaryÊý¾ÝÖ¡½«»á±»´«µÝ¸øÏÂÒ»¸öChannelHandler½øÐд¦Àí¡£
±£»¤WenSocket£ºÒªÏëΪWebSocketÌí¼Ó°²È«ÐÔ£¬Ö»ÐèÒª½«SslHandler×÷ΪµÚÒ»¸öChannelHandlerÌí¼Óµ½ChannelPipelineÖС£
7¡¢¿ÕÏеÄÁ¬½ÓºÍ³¬Ê±
Ö»ÒªÄãÓÐЧµØ¹ÜÀíÄãµÄÍøÂç×ÊÔ´£¬ÕâЩ¼¼Êõ¾Í¿ÉÒÔʹµÃÄãµÄÓ¦ÓóÌÐò¸ü¼Ó¸ßЧ¡¢Ò×ÓúͰ²È«¡£
¼ì²â¿ÕÏÐÁ¬½ÓÒÔ¼°³¬Ê±¶ÔÓÚ¼°Ê±ÊÍ·Å×ÊÔ´À´ËµÊÇÖÁ¹ØÖØÒªµÄ¡£
ÈÃÎÒÃÇ×Ðϸ¿´¿´ÔÚʵ¼ùÖÐʹÓõÃ×î¶àµÄIdleStateHandler¡£ÒÔÏ´úÂëչʾÁ˵±Ê¹ÓÃͨ³£µÄ·¢ËÍÐÄÌøÐÅÏ¢µ½Ô¶³Ì½ÚµãµÄ·½·¨Ê±£¬Èç¹ûÔÚ60ÃëÖ®ÄÚûÓнÓÊÕ»ò·¢ËÍÈκεÄÊý¾Ý£¬ÎÒÃǽ«ÈçºÎµÃµ½Í¨Öª£»Èç¹ûûÓÐÏìÓ¦£¬ÔòÁ¬½Ó»á±»¹Ø±Õ¡£
ÒÔÉÏʾÀýÑÝʾÁËÈçºÎʹÓÃIdleStateHandlerÀ´²âÊÔÔ¶³Ì½ÚµãÊÇ·ñÈÔÈ»»¹»î×Å£¬²¢ÇÒÔÚËüʧ»îʱͨ¹ý¹Ø±ÕÁ¬½ÓÀ´ÊÍ·Å×ÊÔ´
Èç¹ûÁ¬½Ó³¬¹ý60ÃëûÓнÓÊÕ»òÕß·¢ËÍÈκεÄÊý¾Ý£¬ÄÇôIdleStateHandler½«»áʹÓÃÒ»¸öIdleStateEventʼþÀ´µ÷ÓÃfireUserEventTriggered£¨£©·½·¨¡£HeartbeatHandlerʵÏÖÁËuserEventTriggered£¨£©·½·¨£¬Èç¹ûÕâ¸ö·½·¨¼ì²âµ½IdleStateEventʼþ£¬Ëü½«»á·¢ËÍÐÄÌøÏûÏ¢£¬²¢ÇÒÌí¼ÓÒ»¸ö½«ÔÚ·¢ËͲÙ×÷ʧ°Üʱ¹Ø±Õ¸ÃÁ¬½ÓµÄChannelFutureListener¡£
8¡¢½âÂë»ùÓÚ·Ö¸ô·ûµÄÐÒéºÍ»ùÓÚ³¤¶ÈµÄÐÒé
»ùÓÚ·Ö¸ô·ûµÄ£¨delimited£©ÏûÏ¢ÐÒéʹÓö¨ÒåµÄ×Ö·ûÀ´±ê¼ÇµÄÏûÏ¢»òÏûÏ¢¶Î£¨Í¨³£±»³ÆΪ֡£©µÄ¿ªÍ·»òÕß½áβ¡£ÓÉRFCÎĵµÕýʽ¶¨ÒåµÄÐí¶àÐÒ飨ÈçSMTP¡¢POP3¡¢IMAPÒÔ¼°Telnet£©¶¼ÊÇÕâÑù¡£
ÏÂͼչʾÁ˵±Ö¡ÓÉÐÐβÐòÁÐ\r\n·Ö¸îʱÊÇÈçºÎ±»´¦ÀíµÄ¡£ÒÔÏ´úÂëչʾÁËÈçºÎʹÓÃLineBasedFrameDecoderÀ´´¦ÀíÉÏͼµÄ³¡¾°¡£
Èç¹ûÄãÕýÔÚʹÓóýÁËÐÐβ·ûÖ®ÍâµÄ·Ö¸ô·ûµÄÖ¡£¬ÄÇôÄã¿ÉÒÔÒÔÀàËƵķ½·¨Ê¹ÓÃDelimiterBasedFrameDecoder£¬Ö»ÐèÒª½«Ìض¨µÄ·Ö¸ô·ûÐòÁÐÖ¸¶¨µ½Æä¹¹Ô캯Êý¼´¿É¡£
ÕâЩ½âÂëÆ÷ÊÇʵÏÖÄã×Ô¼ºµÄ»ùÓÚ·Ö¸ô·ûµÄÐÒéµÄ¹¤¾ß¡£×÷ΪʾÀý£¬ÎÒÃǽ«Ê¹ÓÃÏÂÃæµÄÐÒé¹æ·¶£º
¡ª¡ª´«ÈëÊý¾ÝÁ÷ÊÇһϵÁеÄÖ¡£¬Ã¿¸öÖ¡¶¼ÓÉ»»Ðзû£¨\n£©·Ö¸î
¡ª¡ªÃ¿¸öÖ¡¶¼ÓÉһϵÁеÄÔªËØ×é³É£¬Ã¿¸öÔªËض¼Óɵ¥¸ö¿Õ¸ñ×Ö·û·Ö¸î
¡ª¡ªÒ»¸öÖ¡µÄÄÚÈÝ´ú±íÁËÒ»¸öÃüÁî¡¢¶¨ÒåΪһ¸öÃüÁîÃû³Æºó¸ú×ÅÊýÄ¿¿É±äµÄ²ÎÊý
ÎÒÃÇÓÃÓÚÕâ¸öÐÒéµÄ×Ô¶¨Òå½âÂëÆ÷½«¶¨ÒåÒÔÏÂÀࣺ
¡ª¡ªCmd¡ª¡ª½«Ö¡£¨ÃüÁµÄÄÚÈÝ´æ´¢ÔÚByteBufÖУ¬Ò»¸öByteBufÓÃÓÚÃû³Æ£¬ÁíÒ»¸öÓÃÓÚ²ÎÊý
¡ª¡ªCmdDecoder¡ª¡ª´Ó±»ÖØдÁ˵Ädecode£¨£©·½·¨ÖлñÈ¡Ò»ÐÐ×Ö·û´®£¬²¢´ÓËüµÄÄÚÈݹ¹½¨Ò»¸öCmdµÄʵÀý
¡ª¡ªCmdHandler¡ª¡ª´ÓCmdDecoder»ñÈ¡½âÂëµÄCmd¶ÔÏ󣬲¢¶ÔËü½øÐÐһЩ´¦Àí£»
¡ª¡ªCmdHandlerinitializer¡ª¡ªÎªÁ˼ò±ãÆð¼û£¬ÎÒÃǽ«»á°ÑÇ°ÃæµÄÕâЩÀඨÒåΪרÃŵÄChannelInitializerµÄǶÌ×À࣬Æ佫»á°ÑÕâЩChannelInboundHandler°²×°µ½ChannelPipelineÖС£
ÒÔÏ´úÂ룬Õâ¸ö½âÂëÆ÷µÄ¹Ø¼üÊÇÀ©Õ¹LineBasedFrameDecoder¡£
9¡¢»ùÓÚ³¤¶ÈµÄÐÒé
»ùÓÚ³¤¶ÈµÄÐÒéͨ¹ý½«ËüµÄ³¤¶È±àÂëµ½Ö¡µÄÍ·²¿À´¶¨ÒåÖ¡£¬¶ø²»ÊÇʹÓÃÌØÊâµÄ·Ö¸ô·ûÀ´±ê¼ÇËüµÄ½áÊø¡£
ÏÂͼչʾÁËFixedLengthFrameDecoderµÄ¹¦ÄÜ£¬ÆäÔÚ¹¹ÔìʱÒѾָ¶¨ÁËÖ¡³¤¶ÈΪ8×Ö½Ú¡£Ä㽫¾³£»áÓöµ½±»±àÂëµ½ÏûϢͷ²¿µÄÖ¡´óС²»Êǹ̶¨ÖµµÄÐÒ顣ΪÁË´¦ÀíÕâÖֱ䳤֡£¬Äã¿ÉÒÔʹÓÃLengthFieldBasedFrameDecoder£¬Ëü½«´ÓÍ·²¿×Ö¶ÎÈ·¶¨Ö¡³¤£¬È»ºó´ÓÊý¾ÝÁ÷ÖÐÌáÈ¡Ö¸¶¨µÄ×Ö½ÚÊý¡£
ÏÂͼչʾÁËʾÀý£¬ÆäÖ㤶È×Ö¶ÎÔÚÖ¡ÖеÄÆ«ÒÆÁ¿Îª0£¬²¢ÇÒ³¤¶ÈΪ2×Ö½Ú¡£LengthFieldBasedFrameDecoderÌṩÁ˼¸¸ö¹¹Ô캯ÊýÀ´Ö§³Ö¸÷ÖÖ¸÷ÑùµÄÍ·²¿ÅäÖÃÇé¿ö¡£ÒÔÏ´úÂëչʾÁËÈçºÎʹÓÃÆä3¸ö¹¹Ôì²ÎÊý·Ö±ðΪmaxFrameLength¡¢lengthFieldOffsetºÍlengthFieldLengthµÄ¹¹Ô캯Êý¡£ÔÚÕâ¸ö³¡¾°ÖУ¬Ö¡µÄ³¤¶È±»±àÂëµ½ÁËÖ¡ÆðʼµÄÇ°8¸ö×Ö½ÚÖС£
10¡¢Ð´´óÐÍÊý¾Ý
ÒòΪÍøÂç±¥ºÍµÄ¿ÉÄÜÐÔ£¬ÈçºÎÔÚÒì²½¿ò¼ÜÖиßЧµØд´ó¿éµÄÊý¾ÝÊÇÒ»¸öÌØÊâµÄÎÊÌâ¡£ÓÉÓÚд²Ù×÷ÊÇ·Ç×èÈûµÄ£¬ËùÒÔ¼´Ê¹Ã»ÓÐд³öËùÓеÄÊý¾Ý£¬Ð´²Ù×÷Ò²»áÔÚÍê³Éʱ·µ»Ø²¢Í¨ÖªChannelFuture¡£µ±ÕâÖÖÇé¿ö·¢Éúʱ£¬Èç¹ûÈÔÈ»²»Í£µØдÈ룬¾ÍÓÐÄÚ´æºÄ¾¡µÄ·çÏÕ£¬ËùÒÔÔÚд´óÐÍÊý¾Ýʱ£¬ÐèҪ׼±¸ºÃ´¦Àíµ½Ô¶³Ì½ÚµãµÄÁ¬½ÓÊÇÂýËÙÁ¬½ÓµÄÇé¿ö£¬ÕâÖÖÇé¿ö»áµ¼ÖÂÄÚ´æÊͷŵÄÑÓ³Ù¡£
NIOµÄÁ㿽±´ÌØÐÔ£¬ÕâÖÖÌØÐÔÏû³ýÁ˽«ÎļþµÄÄÚÈÝ´ÓÎļþϵͳÒƶ¯µ½ÍøÂçÕ»µÄ¸´Öƹý³Ì¡£ËùÓеÄÒ»Çж¼·¢ÉúÔÚNettyµÄºËÐÄÖУ¬ËùÒÔÓ¦ÓóÌÐòËùÓÐÐèÒª×öµÄ¾ÍÊÇʹÓÃÒ»¸öFileRegion½Ó¿ÚµÄʵÏÖ£¬ÆäÔÚNettyµÄAPIÎĵµÖеĶ¨ÒåÊÇ£º¡°Í¨¹ýÖ§³ÖÁ㿽±´µÄÎļþ´«ÊäµÄChannelÀ´·¢Ë͵ÄÎļþÇøÓò¡£¡±
ÒÔÏ´úÂëչʾÁËÈçºÎͨ¹ý´ÓFileInputStream´´½¨Ò»¸öDefaultFileRegion£¬²¢½«ÆäдÈëChannel£¬´Ó¶øÀûÓÃÁ㿽±´ÌØÐÔÀ´´«ÊäÒ»¸öÎļþµÄÄÚÈÝ¡£
Õâ¸öʾÀýÖ»ÊÊÓÃÓÚÎļþÄÚÈݵÄÖ±½Ó´«Ê䣬²»°üÀ¨Ó¦ÓóÌÐò¶ÔÊý¾ÝµÄÈκδ¦Àí¡£ÔÚÐèÒª½«Êý¾Ý´ÓÎļþϵͳ¸´ÖƵ½Óû§ÄÚ´æÖÐʱ£¬¿ÉÒÔʹÓÃChunkedWriteHandler£¬ËüÖ§³ÖÒ첽д´óÐÍÊý¾ÝÁ÷£¬¶øÓÖ²»»áµ¼Ö´óÁ¿µÄÄÚ´æÏûºÄ¡£
¹Ø¼üÊÇinterface ChunkedInput£¬ÆäÖÐÀàÐͲÎÊýBÊÇreadChunk()·½·¨·µ»ØµÄÀàÐÍ¡£NettyÔ¤ÖÃÁ˸ýӿڵÄ4¸öʵÏÖ¡£
ÒÔÏ´úÂë˵Ã÷ÁËChunkedStreamµÄÓ÷¨£¬ËüÊÇʵ¼ùÖÐ×î³£ÓõÄʵÏÖ¡£ËùʾµÄÀàʹÓÃÁËÒ»¸öFileÒÔ¼°Ò»¸öSslContext½øÐÐʵÀý»¯¡£µ±initChannel()·½·¨±»µ÷ÓÃʱ£¬Ëü½«Ê¹ÓÃËùʾµÄChannelHandlerÁ´³õʼ»¯¸ÃChannel¡£µ±ChannelµÄ״̬±äΪ»î¶¯Ê±£¬WriteStreamHandler½«»áÖð¿éµØ°ÑÀ´×ÔÎļþÖеÄÊý¾Ý×÷ΪChunkedStreamдÈë¡£Êý¾ÝÔÚ´«Êä֮ǰ½«»áÓÉSslHandler¼ÓÃÜ¡£
Öð¿éÊäÈ룺ҪʹÓÃÄã×Ô¼ºµÄChunkedInputʵÏÖ£¬ÇëÔÚChannelPipelineÖа²×°Ò»¸öChunkedWriteHandler
11¡¢JDKÐòÁл¯Êý¾Ý
JDKÌṩÁËObjectOutputStreamºÍObjectInputStream£¬ÓÃÓÚͨ¹ýÍøÂç¶ÔPOJOµÄ»ù±¾Êý¾ÝÀàÐͺÍͼ½øÐÐÐòÁл¯ºÍ·´ÐòÁл¯¡£¸ÃAPI²¢²»¸´ÔÓ£¬¶øÇÒ¿ÉÒÔ±»Ó¦ÓÃÓÚÈκÎʵÏÖÁËjava.io.Serializable½Ó¿ÚµÄ¶ÔÏó¡£µ«ÊÇËüµÄÐÔÄÜÒ²²»ÊǷdz£¸ßЧ¡£
Èç¹ûÄãµÄÓ¦ÓóÌÐò±ØÐëÒªºÍʹÓÃÁËObjectOutputStreamºÍObjectInputStreamµÄÔ¶³Ì½Úµã½»»¥£¬²¢ÇÒ¼æÈÝÐÔÒ²ÊÇÄã×î¹ØÐĵģ¬ÄÇôJDKÐòÁл¯½«ÊÇÕýÈ·µÄÑ¡Ôñ¡£
12¡¢Ê¹ÓÃÁËJBoss Marshalling½øÐÐÐòÁл¯
Èç¹ûÄã¿ÉÒÔ×ÔÓɵØʹÓÃÍⲿÒÀÀµ£¬ÄÇôJBoss Marshalling½«ÊÇÒ»¸öÀíÏëµÄÑ¡Ôñ£ºËû±ÈJDKÐòÁл¯×î¶à¿ì3±¶£¬¶øÇÒÒ²¸ü¼Ó½ô´Õ¡£
ÒÔÏ´úÂëչʾÁËÈçºÎʹÓÃMarshallingDecoderºÍMarshallingEncoder¡£Í¬Ñù£¬¼¸ºõÖ»ÊÇÊʵ±µØÅäÖÃChannelPipeline°ÕÁË¡£
13¡¢Í¨¹ýProtocol BuffersÐòÁл¯
NettyÐòÁл¯µÄ×îºóÒ»¸ö½â¾ö·½°¸ÊÇÀûÓÃProtocol BuffersµÄ±à½âÂëÆ÷£¬ËüÊÇÒ»¸öÓÉGoogle¹«Ë¾¿ª·¢µÄ¡¢ÏÖÔÚÒѾ¿ªÔ´µÄÊý¾Ý½»»»¸ñʽ¡£
Protocol BuffersÒÔÒ»ÖÖ½ô´Õ¶ø¸ßЧµÄ·½Ê½¶Ô½á¹¹»¯µÄÊý¾Ý½øÐбàÂëÒÔ¼°½âÂë¡£Ëü¾ßÓÐÐí¶à±à³ÌÓïÑ԰󶨣¬Ê¹µÃËüºÜÊʺϿçÓïÑÔµÄÏîÄ¿¡£
ÔÚÕâÀïÎÒÃÇÓÖ¿´µ½ÁË£¬Ê¹ÓÃprotobufÖ»²»¹ýÊǽ«ÕýÈ·µÄChannelHandlerÌí¼Óµ½ChannelPipelineÖУ¬ÈçÏ´úÂë¡£
ÁìȡרÊô 10ÔªÎÞÃż÷ȯ
˽Ïí×îР¼¼Êõ¸É»õ