å¾çæ¥èª å å¾ç½
ä»å¤©ç¬è å°±æ½ç©ºåäºä¸ä¸ªå®æ¶è§é¢å¼¹å¹äº¤äºçå°åè½ï¼ä¸å¾ä¸è¯´è¿æ ·çå½¢å¼ä¸ºçè§é¢çç´æï¼è®²ä¹ PPTï¼æ½å¥çå½¢å¼å¢å äºè®¸å¤ä¹è¶£ã
ææ¯éå
â Netty
宿¹å¯¹äº Netty çæè¿°ï¼
https://netty.io/
主è¦å ³é®è¯æè¿°ï¼Netty æ¯å¼æ¥äºä»¶é©±å¨ç½ç»æ¡æ¶ï¼å¯ååç§åè®®æå¡ç«¯ï¼å¹¶ä¸æ¯æäº FTPï¼SMTPï¼HTTP çå¾å¤åè®®ï¼å¹¶ä¸æ§è½ï¼ç¨³å®æ§ï¼çµæ´»æ§é½å¾æ£ã
å¯ä»¥çå° Netty æ´ä½æ¶æä¸åäºä¸ä¸ªé¨åï¼
以鶿·è´ï¼ä¸è´æ§æ¥å£ï¼æ©å±äºä»¶æ¨¡åçåºå±æ ¸å¿ã
Socketï¼Datagramï¼Pipeï¼Http Tunnel ä½ä¸ºä¼ è¾åªä»ã
ä¼ è¾æ¯æçåç§åè®®ï¼HTTP&WebSocketï¼SSLï¼å¤§æä»¶ï¼zlib/gzip åç¼©ï¼ææ¬ï¼äºè¿å¶ï¼Google Protobuf çåç§åç§çä¼ è¾å½¢å¼ã
â¡WebSocket
WebSocket æ¯ä¸ç§å¨å个 TCP è¿æ¥ä¸è¿è¡å ¨åå·¥éä¿¡çåè®®ãWebSocket éä¿¡åè®®äº 2011 年被 IETF å®ä¸ºæ å RFC 6455ï¼å¹¶ç± RFC7936 è¡¥å è§èã
WebSocket API ä¹è¢« W3C å®ä¸ºæ åãWebSocket 使å¾å®¢æ·ç«¯åæå¡å¨ä¹é´çæ°æ®äº¤æ¢å徿´å ç®åï¼å 许æå¡ç«¯ä¸»å¨å客æ·ç«¯æ¨éæ°æ®ã
å¨ WebSocket API ä¸ï¼æµè§å¨åæå¡å¨åªéè¦å®æä¸æ¬¡æ¡æï¼ä¸¤è ä¹é´å°±ç´æ¥å¯ä»¥å建æä¹ æ§çè¿æ¥ï¼å¹¶è¿è¡ååæ°æ®ä¼ è¾ã
为ä»ä¹åè¿æ ·çææ¯éåï¼
ç±ä¸è¿°å¯ç¥ï¼å®æ¶ç´æäº¤äºä½ä¸ºäºå¨å¼æ¯ä¸ä¸ªååæ°æ®ä¼ è¾è¿ç¨ãæä»¥ä½¿ç¨ WebSocketã
Netty æ¬èº«æ¯æäº WebSocket åè®®çå®ç°ï¼è®©å®ç°æ´å ç®åæ¹ä¾¿ã
å®ç°æè·¯
â æå¡æ¶æ
æ´ä½æ¶ææ¯ææå®¢æ·ç«¯é½åæçæå¡ç«¯å¼å¯ä¸ä¸ªååééçæ¶æã
â¡ä¼ è¾æµç¨
å¦ä¸å¾ï¼
å®ç°ææ
å ççææå§ï¼æ¯ä¸æ¯ perfectï¼æ¥ä¸æ¥å°±æ¥çå ·ä½ä»£ç æ¯æä¹å®ç°çå§ã
è§é¢ç´æå¼¹å¹ç¤ºä¾
代ç å®ç°
â 项ç®ç»æ
ä¸ä¸ª maven 项ç®ï¼å°ä»£ç æ¾ä¸ä¸ªå ä¸å°±è¡ã
â¡Java æå¡ç«¯
Java æå¡ç«¯ä»£ç ï¼æ»å ±ä¸ä¸ªç±»ï¼Serverï¼Initailizer å Handlerã
å åä¸ä¸ª netty nio çæå¡ç«¯ï¼ä¸ä¸ª nio çæå¡ï¼å¼å¯ä¸ä¸ª tcp 端å£ã
import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioServerSocketChannel; /** * Copyright(c)lbhbinhao@163.com * @author liubinhao * @date 2021/1/14 * ++++ ______ ______ ______ * +++/ /| / /| / /| * +/_____/ | /_____/ | /_____/ | * | | | | | | | | | * | | | | | |________| | | * | | | | | / | | | * | | | | |/___________| | | * | | |___________________ | |____________| | | * | | / / | | | | | | | * | |/ _________________/ / | | / | | / * |_________________________|/b |_____|/ |_____|/ */ public enum BulletChatServer { /** * Server instance */ SERVER; private BulletChatServer(){ EventLoopGroup mainGroup = new NioEventLoopGroup(); EventLoopGroup subGroup = new NioEventLoopGroup(); ServerBootstrap server = new ServerBootstrap(); server.group(mainGroup,subGroup) .channel(NioServerSocketChannel.class) .childHandler(new BulletChatInitializer()); ChannelFuture future = server.bind(9123); } public static void main(String[] args) { } }
æå¡ç«¯çå ·ä½å¤çé»è¾ï¼
import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelPipeline; import io.netty.channel.socket.SocketChannel; import io.netty.handler.codec.http.HttpObjectAggregator; import io.netty.handler.codec.http.HttpServerCodec; import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler; import io.netty.handler.stream.ChunkedWriteHandler; import io.netty.handler.timeout.IdleStateHandler; /** * Copyright(c)lbhbinhao@163.com * * @author liubinhao * @date 2021/1/14 * ++++ ______ ______ ______ * +++/ /| / /| / /| * +/_____/ | /_____/ | /_____/ | * | | | | | | | | | * | | | | | |________| | | * | | | | | / | | | * | | | | |/___________| | | * | | |___________________ | |____________| | | * | | / / | | | | | | | * | |/ _________________/ / | | / | | / * |_________________________|/b |_____|/ |_____|/ */ public class BulletChatInitializer extends ChannelInitializer{ @Override protected void initChannel(SocketChannel ch) throws Exception { ChannelPipeline pipeline = ch.pipeline(); pipeline.addLast(new HttpServerCodec()); pipeline.addLast(new ChunkedWriteHandler()); pipeline.addLast(new HttpObjectAggregator(1024*64)); pipeline.addLast(new IdleStateHandler(8, 10, 12)); pipeline.addLast(new WebSocketServerProtocolHandler("/lbh")); pipeline.addLast(new BulletChatHandler()); } }
åå°å¤çé»è¾ï¼æ¥åå°æ¶æ¯ï¼ååºå°ææç客æ·ç«¯ï¼
import io.netty.channel.Channel; import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import io.netty.channel.group.ChannelGroup; import io.netty.channel.group.DefaultChannelGroup; import io.netty.handler.codec.http.websocketx.TextWebSocketFrame; import io.netty.util.concurrent.EventExecutorGroup; import io.netty.util.concurrent.GlobalEventExecutor; /** * Copyright(c)lbhbinhao@163.com * * @author liubinhao * @date 2021/1/14 * ++++ ______ ______ ______ * +++/ /| / /| / /| * +/_____/ | /_____/ | /_____/ | * | | | | | | | | | * | | | | | |________| | | * | | | | | / | | | * | | | | |/___________| | | * | | |___________________ | |____________| | | * | | / / | | | | | | | * | |/ _________________/ / | | / | | / * |_________________________|/b |_____|/ |_____|/ */ public class BulletChatHandler extends SimpleChannelInboundHandler{ // ç¨äºè®°å½åç®¡çææå®¢æ·ç«¯çchannel public static ChannelGroup channels = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE); @Override protected void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame msg) throws Exception { // è·å客æ·ç«¯ä¼ è¾è¿æ¥çæ¶æ¯ String content = msg.text(); System.err.println("æ¶å°æ¶æ¯ï¼"+ content); channels.writeAndFlush(new TextWebSocketFrame(content)); System.err.println("ååºæ¶æ¯å®æï¼"+content); } @Override public void handlerAdded(ChannelHandlerContext ctx) throws Exception { channels.add(ctx.channel()); } @Override public void handlerRemoved(ChannelHandlerContext ctx) throws Exception { String channelId = ctx.channel().id().asShortText(); System.out.println("客æ·ç«¯è¢«ç§»é¤ï¼channelId为ï¼" + channelId); channels.remove(ctx.channel()); } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { cause.printStackTrace(); // åçå¼å¸¸ä¹åå ³éè¿æ¥ï¼å ³échannelï¼ï¼éåä»ChannelGroupä¸ç§»é¤ ctx.channel().close(); channels.remove(ctx.channel()); } }
â¢ç½é¡µå®¢æ·ç«¯å®ç°
代ç å¦ä¸ï¼
Nettyè§é¢å¼¹å¹å®ç° Author:Binhao Liu åé
è¿æ ·ä¸ä¸ªå®æ¶çè§é¢å¼¹å¹åè½å°±å®æå¦ï¼æ¯ä¸æ¯å¾ç®åï¼åä½å°ä¼ä¼´å¿«æ¥è¯è¯å§ã
å°ç»
è¿ä¸ªè¿æ¯å¾ç®åï¼ç¬è åè¿ä¸ªçæ¶åä¸ä¼å¿å°±åå®äºãä¸è¿è¿ä¹å¾çäºç¬è å¾ä¹ 以åå°±åè¿ Netty çæå¡ï¼å¯¹äº HTTPï¼TCP ä¹ç±»åè®®ä¹æ¯è¾çæã
åªæåç«¯ä¼æäºé¾åº¦ï¼é®ä¸åº¦å¨ï¼ä¹å¾å¿«è½åå®ï¼å¨æ¤åäº«åºæ¥ä¸è¯¸ååäº«ï¼æé®é¢å¯æ¾ç¬è 交æµãPSï¼å¦æä¸èªå·±å¼åï¼éç¨å¸é¢ä¸ä¸»æµé讯äºäº§åï¼éæç¯ä¿¡å³æ¶éè®¯äºæç¯ä¿¡MQTTåè½å®ç°å¼¹å¹äº¤äºåè½ã
ä½è ï¼å ´è¶£ä½¿ç¶çç¨åºç¿
ç¼è¾ï¼é¶å®¶é¾
åºå¤ï¼http://adkx.net/w71wf







