·ÖÏíweb¿ª·¢ÖªÊ¶

×¢²á/µÇ¼|×î½ü·¢²¼|½ñÈÕÍÆ¼ö

Ö÷Ò³ ITÖªÊ¶ÍøÒ³¼¼ÊõÈí¼þ¿ª·¢Ç°¶Ë¿ª·¢´úÂë±à³ÌÔËӪά»¤¼¼Êõ·ÖÏí½Ì³Ì°¸Àý
µ±Ç°Î»ÖãºÊ×Ò³ > ½Ì³Ì°¸Àý

Nettyʵսʮһ֮ԤÖõÄChannelHandlerºÍ±à½âÂëÆ÷

·¢²¼Ê±¼ä£º2023-09-06 02:00ÔðÈα༭£ºÉòСÓê¹Ø¼ü´Ê£ºÔÝÎÞ±êÇ©

NettyΪÐí¶àͨÓÃЭÒéÌṩÁ˱à½âÂëÆ÷ºÍ´¦ÀíÆ÷£¬¼¸ºõ¿ÉÒÔ¿ªÏä¼´Óã¬Õâ¼õÉÙÁËÄãÔÚÄÇЩÏ൱·±ËöµÄÊÂÎñÉϱ¾À´»á»¨·ÑµÄʱ¼äÓ뾫Á¦¡£ÎÒÃǽ«Ì½ÌÖÕâЩ¹¤¾ßÒÔ¼°ËüÃÇËù´øÀ´µÄºÃ´¦£¬ÆäÖаüÀ¨Netty¶ÔÓÚSSL/TLSºÍWebSocketµÄÖ§³Ö£¬ÒÔ¼°ÈçºÎ¼òµ¥µØÍ¨¹ýÊý¾ÝѹËõÀ´Ñ¹Õ¥HTTP£¬ÒÔ»ñÈ¡¸üºÃµÄÐÔÄÜ¡£

1¡¢Í¨¹ýSSL/TLS±£»¤NettyÓ¦ÓóÌÐò

SSLºÍTLSÕâÑùµÄ°²È«Ð­Ò飬ËüÃDzãµþÔÚÆäËûЭÒéÖ®ÉÏ£¬ÓÃÒÔʵÏÖÊý¾Ý°²È«¡£ÎÒÃÇÔÚ·ÃÎʰ²È«ÍøÕ¾Ê±Óöµ½¹ýÕâЩЭÒ飬µ«ÊÇËüÃÇÒ²¿ÉÓÃÓÚÆäËû²»ÊÇ»ùÓÚHTTPµÄÓ¦ÓóÌÐò£¬È簲ȫSMTP£¨SMTPS£©Óʼþ·þÎñÆ÷ÉõÖÁÊǹØÏµÐÍÊý¾Ý¿âϵͳ¡£

ΪÁËÖ§³ÖSSL/TLS£¬JavaÌṩÁËjavax.net.ssl°ü£¬ËüµÄSSLContextºÍSSLEngineÀàʹµÃʵÏÖ½âÃܺͼÓÃÜÏ൱¼òµ¥Ö±½Ó¡£Nettyͨ¹ýÒ»¸öÃûΪSslHandlerµÄChannelHandlerʵÏÖÀûÓÃÁËÕâ¸öAPI£¬ÆäÖÐSslHandlerÔÚÄÚ²¿Ê¹ÓÃÁËSSLEngineÀ´Íê³Éʵ¼ÊµÄ¹¤×÷¡£

ÏÂͼչʾÁËʹÓÃSslHandlerµÄÊý¾ÝÁ÷ÒÔÏ´úÂëչʾÁËÈçºÎʹÓÃChannelInitializerÀ´½«SslHandlerÌí¼Óµ½ChannelPipelineÖС£

public class SSLChannelInitializer extends ChannelInitializer<Channel>{ ???private final SslContext context; ???private final boolean startTls; ???//Èç¹ûÉèÖÃΪtrue£¬µÚÒ»¸öдÈëµÄÏûÏ¢½«²»»á±»¼ÓÃÜ£¨¿Í»§¶ËÓ¦¸ÃÉèÖÃΪtrue£© ???public SSLChannelInitializer(SslContext context, boolean startTls) { ???????this.context = context; ???????this.startTls = startTls; ???} ???@Override ???protected void initChannel(Channel ch) throws Exception { ???????//¶ÔÓÚÿ¸öSslHandlerʵÀý£¬¶¼Ê¹ÓÃChannelµÄByteBufAllocator´ÓSslCOntext»ñȡһ¸öеÄSSLEngine ???????SSLEngine engine = context.newEngine(ch.alloc()); ???????//½«SslHandler×÷ΪµÚÒ»¸öChannelHandlerÌí¼Óµ½ChannelPipelineÖÐ ???????ch.pipeline().addLast("ssl",new SslHandler(engine,startTls)); ???}}

ÔÚ´ó¶àÊýÇé¿öÏ£¬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ÖС£

public class HttpPipelineInitializer extends ChannelInitializer<Channel>{ ???private final boolean client; ???public HttpPipelineInitializer(boolean client) { ???????this.client = client; ???} ???@Override ???protected void initChannel(Channel ch) throws Exception { ???????ChannelPipeline pipeline = ch.pipeline(); ???????if (client){ ???????????//Èç¹ûÊǿͻ§¶Ë£¬ÔòÌí¼ÓHttpResponseDecoderÒÔ´¦ÀíÀ´×Ô·þÎñÆ÷µÄÏìÓ¦ ???????????pipeline.addLast("decoder",new HttpResponseDecoder()); ???????????//Ìí¼ÓHttpResponseEncoderÒÔÏò·þÎñÆ÷·¢ËÍÇëÇó ???????????pipeline.addLast("encoder",new HttpResponseEncoder()); ???????} else { ???????????//Èç¹ûÊÇ·þÎñÆ÷£¬ÔòÌí¼ÓHttpRequestDecoderÒÔ½ÓÊÕÀ´×Ô¿Í»§¶ËµÄÇëÇó ???????????pipeline.addLast("decoder",new HttpRequestDecoder()); ???????????//Ìí¼ÓHttpRequestEncoderÒÔÏò¿Í»§¶Ë·¢ËÍÏìÓ¦ ???????????pipeline.addLast("encoder",new HttpRequestEncoder()); ???????} ???}}

3¡¢¾ÛºÏHTTPÏûÏ¢

ÔÚChannelInitializer½«ChannelHandler°²×°µ½ChannelPipelineÖÐÖ®ºó£¬Äã±ã¿ÉÒÔ´¦Àí²»Í¬ÀàÐ͵ÄHttpObjectÏûÏ¢ÁË¡£µ«ÊÇÓÉÓÚHTTPµÄÇëÇóºÍÏìÓ¦¿ÉÄÜÓÉÐí¶à²¿·Ö×é³É£¬Òò´ËÄãÐèÒª¾ÛºÏËüÃÇÒÔÐγÉÍêÕûµÄÏûÏ¢¡£ÎªÁËÏû³ýÕâÏî·±ËöµÄÈÎÎñ£¬NettyÌṩÁËÒ»¸ö¾ÛºÏÆ÷£¬Ëü¿ÉÒÔ½«¶à¸öÏûÏ¢²¿·ÖºÏ²¢ÎªFullHttpRequest»òÕßFullHttpResponseÏûÏ¢¡£Í¨¹ýÕâÑùµÄ·½Ê½£¬Ä㽫×ÜÊÇ¿´µ½ÍêÕûµÄÏûÏ¢ÄÚÈÝ¡£

ÓÉÓÚÏûÏ¢·Ö¶ÎÐèÒª±»»º³å£¬Ö±µ½¿ÉÒÔת·¢Ò»¸öÍêÕûµÄÏûÏ¢¸øÏÂÒ»¸öChannelInboundHandler£¬ËùÒÔÕâ¸ö²Ù×÷ÓÐÇá΢µÄ¿ªÏú¡£ÆäËù´øÀ´µÄºÃ´¦±ãÊÇÄã²»±Ø¹ØÐÄÏûÏ¢Ë鯬ÁË¡£

ÒýÈëÕâÖÖ×Ô¶¯¾ÛºÏ»úÖÆÖ»²»¹ýÊÇÏòChannelPipelineÖÐÌí¼ÓÁíÍâÒ»¸öChannelHandler°ÕÁË¡£ÈçÒÔÏ´úÂëËùʾ¡£

public class HttpAggregatorInitializer extends ChannelInitializer<Channel>{ ???private final boolean isClient; ???public HttpAggregatorInitializer(boolean isClient) { ???????this.isClient = isClient; ???} ???@Override ???protected void initChannel(Channel ch) throws Exception { ???????ChannelPipeline pipeline = ch.pipeline(); ???????if (isClient) { ???????????//Èç¹ûÊǿͻ§¶Ë£¬ÔòÌí¼ÓHttpClineCodec ???????????pipeline.addLast("codec",new HttpClientCodec()); ???????} else { ???????????//Èç¹ûÊÇ·þÎñ¶Ë£¬ÔòÌí¼ÓHttpServerCodec ???????????pipeline.addLast("codec",new HttpServerCodec()); ???????} ???????//½«×î´óµÄÏûÏ¢´óСΪ512KBµÄHttpObjectAggregatorÌí¼Óµ½ChannelPipeline ???????pipeline.addLast("aggregator",new HttpObjectAggregator(512 * 1024)); ???}}

4¡¢HTTPѹËõ

µ±Ê¹ÓÃHTTPʱ£¬½¨Ò鿪ÆôѹËõ¹¦ÄÜÒÔ¾¡¿ÉÄÜ¶àµØ¼õÉÙ´«ÊäÊý¾ÝµÄ´óС¡£ËäȻѹËõ»á´øÀ´Ò»Ð©CPUʱÖÓÖÜÆÚÉϵĿªÏú£¬µ«ÊÇͨ³£À´ËµËü¶¼ÊÇÒ»¸öºÃÖ÷Òâ£¬ÌØ±ðÊǶÔÓÚÎı¾Êý¾ÝÀ´Ëµ¡£

NettyΪѹËõºÍ½âѹËõÌṩÁËChannelHandlerʵÏÖ£¬ËüÃÇͬʱ֧³ÖgzipºÍdeflate±àÂë¡£

HTTPÇëÇóµÄÍ·²¿ÐÅÏ¢£¬¿Í»§¶Ë¿ÉÒÔͨ¹ýÌṩÒÔÏÂÍ·²¿ÐÅÏ¢À´Ö¸Ê¾·þÎñÆ÷ËüËùÖ§³ÖµÄѹËõ¸ñʽ£º

Get /encrypted-area HTTP/1.1

Host:www.example.com

Accept-Encoding:gzip,deflate

È»¶ø£¬ÐèҪעÒâµÄÊÇ£¬·þÎñÆ÷ûÓÐÒåÎñѹËõËüËù·¢Ë͵ÄÊý¾Ý¡£

ÒÔÏ´úÂëչʾÁËÒ»¸öÀý×Ó¡£

public class HttpCompressionInitializer extends ChannelInitializer<Channel>{ ???private final boolean isClient; ???public HttpCompressionInitializer(boolean isClient) { ???????this.isClient = isClient; ???} ???@Override ???protected void initChannel(Channel ch) throws Exception { ???????ChannelPipeline pipeline = ch.pipeline(); ???????if (isClient) { ???????????//Èç¹ûÊǿͻ§¶Ë£¬ÔòÌí¼ÓHttpClientCodec ???????????pipeline.addLast("codec",new HttpClientCodec()); ???????????//Èç¹ûÊǿͻ§¶Ë£¬ÔòÌí¼ÓHttpContentDecompressorÒÔ´¦ÀíÀ´×Ô·þÎñÆ÷µÄѹËõÄÚÈÝ ???????????pipeline.addLast("decompressor",new HttpContentDecompressor()); ???????} else { ???????????//Èç¹ûÊÇ·þÎñÆ÷£¬ÔòÌí¼ÓHttpServerCodec ???????????pipeline.addLast("codec",new HttpServerCodec()); ???????????//Èç¹ûÊÇ·þÎñÆ÷£¬ÔòÌí¼ÓHttpContentCompressorÀ´Ñ¹ËõÊý¾Ý ???????????pipeline.addLast("decompressor",new HttpContentCompressor()); ???????} ???}}

5¡¢Ê¹ÓÃHTTPS

ÒÔÏ´úÂëÏÔʾ£¬ÆôÓÃHTTPSÖ»ÐèÒª½«SslHandlerÌí¼Óµ½ChannelPipelineµÄChannelHandler×éºÏÖС£

public class HttpsCodecInitializer extends ChannelInitializer<Channel>{ ???private final SslContext context; ???private final boolean isClient; ???public HttpsCodecInitializer(SslContext context, boolean isClient) { ???????this.context = context; ???????this.isClient = isClient; ???} ???@Override ???protected void initChannel(Channel channel) throws Exception { ???????ChannelPipeline pipeline = channel.pipeline(); ???????SSLEngine engine = context.newEngine(channel.alloc()); ???????//½«SslHandlerÌí¼Óµ½ChannelPipelineÖÐÒÔʹÓÃHTTPS ???????pipeline.addLast("ssl",new SslHandler(engine)); ???????if (isClient) { ???????????//Èç¹ûÊǿͻ§¶Ë£¬ÔòÌí¼ÓHttpClientCodec ???????????pipeline.addLast("codec",new HttpClientCodec()); ???????} else { ???????????//Èç¹ûÊÇ·þÎñÆ÷£¬ÔòÌí¼ÓHttpServerCodec ???????????pipeline.addLast("codec",new HttpServerCodec()); ???????} ???}}

ÒÔÉÏÀý×Ó£¬ËµÃ÷ÁË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½øÐд¦Àí¡£

public class WebSocketServerInitializer extends ChannelInitializer<Channel>{ ???@Override ???protected void initChannel(Channel ch) throws Exception { ???????ch.pipeline().addLast( ???????????????new HttpServerCodec(), ???????????????//ΪÎÕÊÖÌṩ¾ÛºÏµÄHttpRequest ???????????????new HttpObjectAggregator(65535), ???????????????//Èç¹û±»ÇëÇóµÄ¶ËµãÊÇ¡°/websocket¡±Ôò´¦Àí¸ÃÉý¼¶ÎÕÊÖ ???????????????new WebSocketServerProtocolHandler("/websocket"), ???????????????new TextFrameHandler(), ???????????????new BinaryFrameHandler(), ???????????????new ContinuationFrameHandler() ???????); ???} ???public static final class TextFrameHandler extends SimpleChannelInboundHandler<TextWebSocketFrame>{ ???????@Override ???????protected void channelRead0(ChannelHandlerContext channelHandlerContext, ???????????????????????????????????TextWebSocketFrame textWebSocketFrame) throws Exception { ???????????//Handle text frame ???????} ???} ???public static final class BinaryFrameHandler extends SimpleChannelInboundHandler<BinaryWebSocketFrame>{ ???????@Override ???????protected void channelRead0(ChannelHandlerContext channelHandlerContext, ???????????????????????????????????BinaryWebSocketFrame binaryWebSocketFrame) throws Exception { ???????????//Handle binary frame ???????} ???} ???public static final class ContinuationFrameHandler extends SimpleChannelInboundHandler<ContinuationWebSocketFrame>{ ???????@Override ???????protected void channelRead0(ChannelHandlerContext channelHandlerContext, ???????????????????????????????????ContinuationWebSocketFrame continuationWebSocketFrame) throws Exception { ???????????//Handle continuation frame ???????} ???}}

±£»¤WenSocket£ºÒªÏëΪWebSocketÌí¼Ó°²È«ÐÔ£¬Ö»ÐèÒª½«SslHandler×÷ΪµÚÒ»¸öChannelHandlerÌí¼Óµ½ChannelPipelineÖС£

7¡¢¿ÕÏеÄÁ¬½ÓºÍ³¬Ê±

Ö»ÒªÄãÓÐЧµØ¹ÜÀíÄãµÄÍøÂç×ÊÔ´£¬ÕâЩ¼¼Êõ¾Í¿ÉÒÔʹµÃÄãµÄÓ¦ÓóÌÐò¸ü¼Ó¸ßЧ¡¢Ò×ÓúͰ²È«¡£

¼ì²â¿ÕÏÐÁ¬½ÓÒÔ¼°³¬Ê±¶ÔÓÚ¼°Ê±ÊÍ·Å×ÊÔ´À´ËµÊÇÖÁ¹ØÖØÒªµÄ¡£

ÈÃÎÒÃÇ×Ðϸ¿´¿´ÔÚʵ¼ùÖÐʹÓõÃ×î¶àµÄIdleStateHandler¡£ÒÔÏ´úÂëչʾÁ˵±Ê¹ÓÃͨ³£µÄ·¢ËÍÐÄÌøÐÅÏ¢µ½Ô¶³Ì½ÚµãµÄ·½·¨Ê±£¬Èç¹ûÔÚ60ÃëÖ®ÄÚûÓнÓÊÕ»ò·¢ËÍÈκεÄÊý¾Ý£¬ÎÒÃǽ«ÈçºÎµÃµ½Í¨Öª£»Èç¹ûûÓÐÏìÓ¦£¬ÔòÁ¬½Ó»á±»¹Ø±Õ¡£

public class IdleStateHandlerInitializer extends ChannelInitializer<Channel>{ ???@Override ???protected void initChannel(Channel ch) throws Exception { ???????ChannelPipeline pipeline = ch.pipeline(); ???????//IdleStateHandler½«ÔÚ±»´¥·¢Ê±·¢ËÍÒ»¸öIdleStateEventʼþ ???????pipeline.addLast(new IdleStateHandler(0,0,60, TimeUnit.SECONDS)); ???????pipeline.addLast(new HeartbeatHandler()); ???} ???//ʵÏÖuserEventTriggered·½·¨ÒÔ·¢ËÍÐÄÌøÏûÏ¢ ???public static final class HeartbeatHandler extends ChannelInboundHandlerAdapter{ ???????private static final ByteBuf HEARTBEAT_SEQUENCE = ???????????????//·¢Ë͵½Ô¶³Ì½ÚµãµÄÐÄÌøÏûÏ¢ ???????????????Unpooled.unreleasableBuffer(Unpooled.copiedBuffer("HEARTBEAT", CharsetUtil.ISO_8859_1)); ???????@Override ???????public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { ???????????//·¢ËÍÐÄÌøÏûÏ¢£¬²¢ÔÚ·¢ËÍʧ°Üʱ¹Ø±Õ¸ÃÁ¬½Ó ???????????if (evt instanceof IdleStateEvent){ ???????????????ctx.writeAndFlush(HEARTBEAT_SEQUENCE.duplicate()) ???????????????????????.addListener(ChannelFutureListener.CLOSE_ON_FAILURE); ???????????} else { ???????????????super.userEventTriggered(ctx, evt); ???????????} ???????} ???}}

ÒÔÉÏʾÀýÑÝʾÁËÈçºÎʹÓÃIdleStateHandlerÀ´²âÊÔÔ¶³Ì½ÚµãÊÇ·ñÈÔÈ»»¹»î×Å£¬²¢ÇÒÔÚËüʧ»îʱͨ¹ý¹Ø±ÕÁ¬½ÓÀ´ÊÍ·Å×ÊÔ´

Èç¹ûÁ¬½Ó³¬¹ý60ÃëûÓнÓÊÕ»òÕß·¢ËÍÈκεÄÊý¾Ý£¬ÄÇôIdleStateHandler½«»áʹÓÃÒ»¸öIdleStateEventʼþÀ´µ÷ÓÃfireUserEventTriggered£¨£©·½·¨¡£HeartbeatHandlerʵÏÖÁËuserEventTriggered£¨£©·½·¨£¬Èç¹ûÕâ¸ö·½·¨¼ì²âµ½IdleStateEventʼþ£¬Ëü½«»á·¢ËÍÐÄÌøÏûÏ¢£¬²¢ÇÒÌí¼ÓÒ»¸ö½«ÔÚ·¢ËͲÙ×÷ʧ°Üʱ¹Ø±Õ¸ÃÁ¬½ÓµÄChannelFutureListener¡£

8¡¢½âÂë»ùÓÚ·Ö¸ô·ûµÄЭÒéºÍ»ùÓÚ³¤¶ÈµÄЭÒé

»ùÓÚ·Ö¸ô·ûµÄ£¨delimited£©ÏûϢЭÒéʹÓö¨ÒåµÄ×Ö·ûÀ´±ê¼ÇµÄÏûÏ¢»òÏûÏ¢¶Î£¨Í¨³£±»³ÆÎªÖ¡£©µÄ¿ªÍ·»òÕß½áβ¡£ÓÉRFCÎĵµÕýʽ¶¨ÒåµÄÐí¶àЭÒ飨ÈçSMTP¡¢POP3¡¢IMAPÒÔ¼°Telnet£©¶¼ÊÇÕâÑù¡£

ÏÂͼչʾÁ˵±Ö¡ÓÉÐÐβÐòÁÐ\r\n·Ö¸îʱÊÇÈçºÎ±»´¦ÀíµÄ¡£ÒÔÏ´úÂëչʾÁËÈçºÎʹÓÃLineBasedFrameDecoderÀ´´¦ÀíÉÏͼµÄ³¡¾°¡£

public class LineBasedHandlerInitializer extends ChannelInitializer<Channel>{ ???@Override ???protected void initChannel(Channel channel) throws Exception { ???????ChannelPipeline pipeline = channel.pipeline(); ???????//¸ÃLineBasedFrameDecoder½«ÌáÈ¡µÄ֡ת·¢¸øÏÂÒ»¸öChannelInboundHandler ???????pipeline.addLast(new LineBasedFrameDecoder(64*1024)); ???????//Ìí¼ÓFrameHandlerÒÔ½ÓÊÕÖ¡ ???????pipeline.addLast(new FrameHandler()); ???} ???public static final class FrameHandler ???????????extends SimpleChannelInboundHandler<ByteBuf>{ ???????@Override ???????//´«Èëµ¥¸öÖ¡µÄÄÚÈÝ ???????protected void channelRead0(ChannelHandlerContext channelHandlerContext, ???????????????????????????????????ByteBuf byteBuf) throws Exception { ???????????// do something with the data extracted from the frame ???????} ???}}

Èç¹ûÄãÕýÔÚʹÓóýÁËÐÐβ·ûÖ®ÍâµÄ·Ö¸ô·ûµÄÖ¡£¬ÄÇôÄã¿ÉÒÔÒÔÀàËÆµÄ·½·¨Ê¹ÓÃDelimiterBasedFrameDecoder£¬Ö»ÐèÒª½«Ìض¨µÄ·Ö¸ô·ûÐòÁÐÖ¸¶¨µ½Æä¹¹Ô캯Êý¼´¿É¡£

ÕâЩ½âÂëÆ÷ÊÇʵÏÖÄã×Ô¼ºµÄ»ùÓÚ·Ö¸ô·ûµÄЭÒéµÄ¹¤¾ß¡£×÷ΪʾÀý£¬ÎÒÃǽ«Ê¹ÓÃÏÂÃæµÄЭÒ鹿·¶£º

¡ª¡ª´«ÈëÊý¾ÝÁ÷ÊÇһϵÁеÄÖ¡£¬Ã¿¸öÖ¡¶¼ÓÉ»»Ðзû£¨\n£©·Ö¸î

¡ª¡ªÃ¿¸öÖ¡¶¼ÓÉһϵÁеÄÔªËØ×é³É£¬Ã¿¸öÔªËØ¶¼Óɵ¥¸ö¿Õ¸ñ×Ö·û·Ö¸î

¡ª¡ªÒ»¸öÖ¡µÄÄÚÈÝ´ú±íÁËÒ»¸öÃüÁî¡¢¶¨ÒåΪһ¸öÃüÁîÃû³Æºó¸ú×ÅÊýÄ¿¿É±äµÄ²ÎÊý

ÎÒÃÇÓÃÓÚÕâ¸öЭÒéµÄ×Ô¶¨Òå½âÂëÆ÷½«¶¨ÒåÒÔÏÂÀࣺ

¡ª¡ªCmd¡ª¡ª½«Ö¡£¨ÃüÁµÄÄÚÈÝ´æ´¢ÔÚByteBufÖУ¬Ò»¸öByteBufÓÃÓÚÃû³Æ£¬ÁíÒ»¸öÓÃÓÚ²ÎÊý

¡ª¡ªCmdDecoder¡ª¡ª´Ó±»ÖØÐ´Á˵Ädecode£¨£©·½·¨ÖлñȡһÐÐ×Ö·û´®£¬²¢´ÓËüµÄÄÚÈݹ¹½¨Ò»¸öCmdµÄʵÀý

¡ª¡ªCmdHandler¡ª¡ª´ÓCmdDecoder»ñÈ¡½âÂëµÄCmd¶ÔÏ󣬲¢¶ÔËü½øÐÐһЩ´¦Àí£»

¡ª¡ªCmdHandlerinitializer¡ª¡ªÎªÁ˼ò±ãÆð¼û£¬ÎÒÃǽ«»á°ÑÇ°ÃæµÄÕâЩÀඨÒåΪרÃŵÄChannelInitializerµÄǶÌ×À࣬Æä½«»á°ÑÕâЩChannelInboundHandler°²×°µ½ChannelPipelineÖС£

ÒÔÏ´úÂ룬Õâ¸ö½âÂëÆ÷µÄ¹Ø¼üÊÇÀ©Õ¹LineBasedFrameDecoder¡£

public class CmdHandlerInitializer extends ChannelInitializer<Channel>{ ???public static final byte SPACE = (byte)¡® ¡®; ???@Override ???protected void initChannel(Channel channel) throws Exception { ???????ChannelPipeline pipeline = channel.pipeline(); ???????//Ìí¼ÓCmdDecoderÒÔÌáÈ¡Cmd¶ÔÏ󣬲¢½«Ëüת·¢¸øÏÂÒ»¸öChannelInboundHandler ???????pipeline.addLast(new CmdDecoder(64*1024)); ???????//Ìí¼ÓCmdHandlerÒÔ½ÓÊպʹ¦ÀíCmd¶ÔÏó ???????pipeline.addLast(new CmdHandler()); ???} ???//Cmd POJO ???public static final class Cmd{ ???????private final ByteBuf name; ???????private final ByteBuf args; ???????public Cmd(ByteBuf name, ByteBuf args) { ???????????this.name = name; ???????????this.args = args; ???????} ???????public ByteBuf getName() { ???????????return name; ???????} ???????public ByteBuf getArgs() { ???????????return args; ???????} ???} ???public static final class CmdDecoder extends LineBasedFrameDecoder{ ???????public CmdDecoder(int maxLength) { ???????????super(maxLength); ???????} ???????@Override ???????protected Object decode(ChannelHandlerContext ctx, ByteBuf buffer) throws Exception { ???????????//´ÓByteBufÖÐÌáÈ¡ÓÉÐÐβ·ûÐòÁзָôµÄÖ¡ ???????????ByteBuf frame = (ByteBuf) super.decode(ctx, buffer); ???????????if (frame == null){ ???????????????//Èç¹ûÊäÈëÖÐûÓÐÖ¡£¬Ôò·µ»Ønull ???????????????return null; ???????????} ???????????//²éÕÒµÚÒ»¸ö¿Õ¸ñ×Ö·ûµÄË÷Òý ???????????int index = frame.indexOf(frame.readerIndex(),frame.writerIndex(),SPACE); ???????????//ʹÓðüº¬ÓÐÃüÁîÃû³ÆºÍ²ÎÊýµÄÇÐÆ¬´´½¨ÐµÄCmd¶ÔÏó ???????????return new Cmd(frame.slice(frame.readerIndex(),index),frame.slice(index + 1,frame.writerIndex())); ???????} ???} ???public static final class CmdHandler extends SimpleChannelInboundHandler<Cmd>{ ???????@Override ???????protected void channelRead0(ChannelHandlerContext channelHandlerContext, Cmd cmd) throws Exception { ???????????//´¦Àí´«¾­ChannelPipelineµÄCmd¶ÔÏó ???????????// do something with the command ???????} ???}}

9¡¢»ùÓÚ³¤¶ÈµÄЭÒé

»ùÓÚ³¤¶ÈµÄЭÒéͨ¹ý½«ËüµÄ³¤¶È±àÂëµ½Ö¡µÄÍ·²¿À´¶¨ÒåÖ¡£¬¶ø²»ÊÇʹÓÃÌØÊâµÄ·Ö¸ô·ûÀ´±ê¼ÇËüµÄ½áÊø¡£

ÏÂͼչʾÁËFixedLengthFrameDecoderµÄ¹¦ÄÜ£¬ÆäÔÚ¹¹ÔìʱÒѾ­Ö¸¶¨ÁËÖ¡³¤¶ÈΪ8×Ö½Ú¡£Ä㽫¾­³£»áÓöµ½±»±àÂëµ½ÏûϢͷ²¿µÄÖ¡´óС²»Êǹ̶¨ÖµµÄЭÒ顣ΪÁË´¦ÀíÕâÖֱ䳤֡£¬Äã¿ÉÒÔʹÓÃLengthFieldBasedFrameDecoder£¬Ëü½«´ÓÍ·²¿×Ö¶ÎÈ·¶¨Ö¡³¤£¬È»ºó´ÓÊý¾ÝÁ÷ÖÐÌáȡָ¶¨µÄ×Ö½ÚÊý¡£

ÏÂͼչʾÁËʾÀý£¬ÆäÖ㤶È×Ö¶ÎÔÚÖ¡ÖÐµÄÆ«ÒÆÁ¿Îª0£¬²¢ÇÒ³¤¶ÈΪ2×Ö½Ú¡£LengthFieldBasedFrameDecoderÌṩÁ˼¸¸ö¹¹Ô캯ÊýÀ´Ö§³Ö¸÷ÖÖ¸÷ÑùµÄÍ·²¿ÅäÖÃÇé¿ö¡£ÒÔÏ´úÂëչʾÁËÈçºÎʹÓÃÆä3¸ö¹¹Ôì²ÎÊý·Ö±ðΪmaxFrameLength¡¢lengthFieldOffsetºÍlengthFieldLengthµÄ¹¹Ô캯Êý¡£ÔÚÕâ¸ö³¡¾°ÖУ¬Ö¡µÄ³¤¶È±»±àÂëµ½ÁËÖ¡ÆðʼµÄǰ8¸ö×Ö½ÚÖС£

public class LengthFieldBasedFrameDecoder extends ChannelInitializer<Channel>{ ???@Override ???protected void initChannel(Channel channel) throws Exception { ???????ChannelPipeline pipeline = channel.pipeline(); ???????pipeline.addLast(new io.netty.handler.codec.LengthFieldBasedFrameDecoder(64*1024,0,8)); ???????//Ìí¼ÓFrameHandlerÒÔ´¦Àíÿ¸öÖ¡ ???????pipeline.addLast(new FrameHandler()); ???} ???public static final class FrameHandler extends SimpleChannelInboundHandler<ByteBuf>{ ???????@Override ???????protected void channelRead0(ChannelHandlerContext channelHandlerContext, ???????????????????????????????????ByteBuf byteBuf) throws Exception { ???????????//´¦ÀíÖ¡µÄÊý¾Ý ???????????// Do something with the frame ???????} ???}}

10¡¢Ð´´óÐÍÊý¾Ý

ÒòÎªÍøÂç±¥ºÍµÄ¿ÉÄÜÐÔ£¬ÈçºÎÔÚÒì²½¿ò¼ÜÖиßЧµØÐ´´ó¿éµÄÊý¾ÝÊÇÒ»¸öÌØÊâµÄÎÊÌâ¡£ÓÉÓÚд²Ù×÷ÊÇ·Ç×èÈûµÄ£¬ËùÒÔ¼´Ê¹Ã»ÓÐд³öËùÓеÄÊý¾Ý£¬Ð´²Ù×÷Ò²»áÔÚÍê³Éʱ·µ»Ø²¢Í¨ÖªChannelFuture¡£µ±ÕâÖÖÇé¿ö·¢Éúʱ£¬Èç¹ûÈÔÈ»²»Í£µØÐ´È룬¾ÍÓÐÄÚ´æºÄ¾¡µÄ·çÏÕ£¬ËùÒÔÔÚд´óÐÍÊý¾Ýʱ£¬ÐèҪ׼±¸ºÃ´¦Àíµ½Ô¶³Ì½ÚµãµÄÁ¬½ÓÊÇÂýËÙÁ¬½ÓµÄÇé¿ö£¬ÕâÖÖÇé¿ö»áµ¼ÖÂÄÚ´æÊͷŵÄÑÓ³Ù¡£

NIOµÄÁ㿽±´ÌØÐÔ£¬ÕâÖÖÌØÐÔÏû³ýÁ˽«ÎļþµÄÄÚÈÝ´ÓÎļþÏµÍ³ÒÆ¶¯µ½ÍøÂçÕ»µÄ¸´Öƹý³Ì¡£ËùÓеÄÒ»Çж¼·¢ÉúÔÚNettyµÄºËÐÄÖУ¬ËùÒÔÓ¦ÓóÌÐòËùÓÐÐèÒª×öµÄ¾ÍÊÇʹÓÃÒ»¸öFileRegion½Ó¿ÚµÄʵÏÖ£¬ÆäÔÚNettyµÄAPIÎĵµÖе͍ÒåÊÇ£º¡°Í¨¹ýÖ§³ÖÁ㿽±´µÄÎļþ´«ÊäµÄChannelÀ´·¢Ë͵ÄÎļþÇøÓò¡£¡±

ÒÔÏ´úÂëչʾÁËÈçºÎͨ¹ý´ÓFileInputStream´´½¨Ò»¸öDefaultFileRegion£¬²¢½«ÆäдÈëChannel£¬´Ó¶øÀûÓÃÁ㿽±´ÌØÐÔÀ´´«ÊäÒ»¸öÎļþµÄÄÚÈÝ¡£

//´´½¨Ò»¸öFileInputStream ???????FileInputStream in = new FileInputStream(file); ???????FileRegion region = new DefaultFileRegion( ???????????????in.getChannel(),0,file.length()); ???????//·¢Ë͸ÃDefaultFileRegion£¬²¢×¢²áÒ»¸öChannelFutureListener ???????channel.writeAndFlush(region).addListener( ???????????????new ChannelFutureListener() { ???????????????????@Override ???????????????????public void operationComplete(ChannelFuture channelFuture) throws Exception { ???????????????????????if (!channelFuture.isSuccess()) { ???????????????????????????//´¦Àíʧ°Ü ???????????????????????????Throwable cause = channelFuture.cause(); ???????????????????????????// Do something ???????????????????????} ???????????????????} ???????????????} ???????);

Õâ¸öʾÀýÖ»ÊÊÓÃÓÚÎļþÄÚÈݵÄÖ±½Ó´«Ê䣬²»°üÀ¨Ó¦ÓóÌÐò¶ÔÊý¾ÝµÄÈκδ¦Àí¡£ÔÚÐèÒª½«Êý¾Ý´ÓÎļþϵͳ¸´ÖƵ½Óû§ÄÚ´æÖÐʱ£¬¿ÉÒÔʹÓÃChunkedWriteHandler£¬ËüÖ§³ÖÒ첽д´óÐÍÊý¾ÝÁ÷£¬¶øÓÖ²»»áµ¼Ö´óÁ¿µÄÄÚ´æÏûºÄ¡£

¹Ø¼üÊÇinterface ChunkedInput£¬ÆäÖÐÀàÐͲÎÊýBÊÇreadChunk()·½·¨·µ»ØµÄÀàÐÍ¡£NettyÔ¤ÖÃÁ˸ýӿڵÄ4¸öʵÏÖ¡£

ÒÔÏ´úÂë˵Ã÷ÁËChunkedStreamµÄÓ÷¨£¬ËüÊÇʵ¼ùÖÐ×î³£ÓõÄʵÏÖ¡£ËùʾµÄÀàʹÓÃÁËÒ»¸öFileÒÔ¼°Ò»¸öSslContext½øÐÐʵÀý»¯¡£µ±initChannel()·½·¨±»µ÷ÓÃʱ£¬Ëü½«Ê¹ÓÃËùʾµÄChannelHandlerÁ´³õʼ»¯¸ÃChannel¡£µ±ChannelµÄ״̬±äΪ»î¶¯Ê±£¬WriteStreamHandler½«»áÖð¿éµØ°ÑÀ´×ÔÎļþÖеÄÊý¾Ý×÷ΪChunkedStreamдÈë¡£Êý¾ÝÔÚ´«Êä֮ǰ½«»áÓÉSslHandler¼ÓÃÜ¡£

public class ChunkedWriteHandlerInitializer extends ChannelInitializer<Channel>{ ???private final File file; ???private final SslContext sslCtx; ???public ChunkedWriteHandlerInitializer(File file, SslContext sslCtx) { ???????this.file = file; ???????this.sslCtx = sslCtx; ???} ???@Override ???protected void initChannel(Channel channel) throws Exception { ???????ChannelPipeline pipeline = channel.pipeline(); ???????//½«SslHandlerÌí¼Óµ½ChannelPipelineÖÐ ???????pipeline.addLast(new SslHandler(sslCtx.newEngine(channel.alloc()))); ???????//Ìí¼ÓChunkedWriteHandlerÒÔ´¦Àí×÷ΪChunkedInput´«ÈëµÄÊý¾Ý ???????pipeline.addLast(new ChunkedWriteHandler()); ???????//Ò»µ©Á¬½Ó½¨Á¢£¬WriteStreamHandler¾Í¿ªÊ¼Ð´ÎļþÊý¾Ý ???????pipeline.addLast(new WriteStreamHandler()); ???} ???public final class WriteStreamHandler extends ChannelInboundHandlerAdapter{ ???????//µ±Á¬½Ó½¨Á¢Ê±£¬channelActive·½·¨½«Ê¹ÓÃChunkedInputдÎļþÊý¾Ý ???????@Override ???????public void channelActive(ChannelHandlerContext ctx) throws Exception { ???????????super.channelActive(ctx); ???????????ctx.writeAndFlush( ???????????????????new ChunkedStream(new FileInputStream(file))); ???????} ???}}

Öð¿éÊäÈ룺ҪʹÓÃÄã×Ô¼ºµÄ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°ÕÁË¡£

public class MarshallingInitializer extends ChannelInitializer<Channel>{ ???private final MarshallerProvider marshallerProvider; ???private final UnmarshallerProvider unmarshallerProvider; ???public MarshallingInitializer(MarshallerProvider marshallerProvider, UnmarshallerProvider unmarshallerProvider) { ???????this.marshallerProvider = marshallerProvider; ???????this.unmarshallerProvider = unmarshallerProvider; ???} ???@Override ???protected void initChannel(Channel channel) throws Exception { ???????ChannelPipeline pipeline = channel.pipeline(); ???????pipeline.addLast(new MarshallingDecoder(unmarshallerProvider)); ???????pipeline.addLast(new MarshallingEncoder(marshallerProvider)); ???????pipeline.addLast(new ObjectHandler()); ???} ???public static final class ObjectHandler extends SimpleChannelInboundHandler<Serializable>{ ???????@Override ???????protected void channelRead0(ChannelHandlerContext channelHandlerContext, ???????????????????????????????????Serializable serializable) throws Exception { ???????????//do something ???????} ???}}

13¡¢Í¨¹ýProtocol BuffersÐòÁл¯

NettyÐòÁл¯µÄ×îºóÒ»¸ö½â¾ö·½°¸ÊÇÀûÓÃProtocol BuffersµÄ±à½âÂëÆ÷£¬ËüÊÇÒ»¸öÓÉGoogle¹«Ë¾¿ª·¢µÄ¡¢ÏÖÔÚÒѾ­¿ªÔ´µÄÊý¾Ý½»»»¸ñʽ¡£

Protocol BuffersÒÔÒ»ÖÖ½ô´Õ¶ø¸ßЧµÄ·½Ê½¶Ô½á¹¹»¯µÄÊý¾Ý½øÐбàÂëÒÔ¼°½âÂë¡£Ëü¾ßÓÐÐí¶à±à³ÌÓïÑ԰󶨣¬Ê¹µÃËüºÜÊʺϿçÓïÑÔµÄÏîÄ¿¡£

ÔÚÕâÀïÎÒÃÇÓÖ¿´µ½ÁË£¬Ê¹ÓÃprotobufÖ»²»¹ýÊǽ«ÕýÈ·µÄChannelHandlerÌí¼Óµ½ChannelPipelineÖУ¬ÈçÏ´úÂë¡£

public class ProtoBufInitializer extends ChannelInitializer<Channel>{ ???private final MessageLite lite; ???public ProtoBufInitializer(MessageLite lite) { ???????this.lite = lite; ???} ???@Override ???protected void initChannel(Channel channel) throws Exception { ???????ChannelPipeline pipeline = channel.pipeline(); ???????pipeline.addLast(new ProtobufVarint32FrameDecoder()); ???????pipeline.addLast(new ProtobufEncoder()); ???????pipeline.addLast(new ProtobufDecoder(lite)); ???????pipeline.addLast(new ObjectHandler()); ???} ???public static final class ObjectHandler extends SimpleChannelInboundHandler<Object>{ ???????@Override ???????protected void channelRead0(ChannelHandlerContext channelHandlerContext, Object o) throws Exception { ???????????// do something with the object ???????} ???}}

Nettyʵսʮһ֮ԤÖõÄChannelHandlerºÍ±à½âÂëÆ÷

Ô­ÎĵØÖ·£ºhttps://www.cnblogs.com/UncleCatMySelf/p/9190634.html

ÖªÊ¶ÍÆ¼ö

Îҵıà³ÌÑ§Ï°Íø¡ª¡ª·ÖÏíwebǰ¶Ëºó¶Ë¿ª·¢¼¼Êõ֪ʶ¡£ À¬»øÐÅÏ¢´¦ÀíÓÊÏä tousu563@163.com ÍøÕ¾µØÍ¼
icp±¸°¸ºÅ ÃöICP±¸2023006418ºÅ-8 ²»Á¼ÐÅÏ¢¾Ù±¨Æ½Ì¨ »¥ÁªÍø°²È«¹ÜÀí±¸°¸ Copyright 2023 www.wodecom.cn All Rights Reserved