热门IT资讯网

Netty4 之 简单搭建WebSocket服务

发表于:2024-11-24 作者:热门IT资讯网编辑
编辑最后更新 2024年11月24日,websocket.server.RandomResponseGenerator.javapackage websocket.server;import io.netty.channel.Channe

websocket.server.RandomResponseGenerator.java

package websocket.server;import io.netty.channel.ChannelHandlerContext;import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;import java.util.Random;import org.apache.log4j.Logger;public class RandomResponseGenerator extends Thread{        private ChannelHandlerContext ctx;                private Random random = new Random();                private int messageCount = 10;                public RandomResponseGenerator(ChannelHandlerContext ctx){                this.ctx=ctx;        }                private Logger logger = Logger.getLogger(RandomResponseGenerator.class);                public void run() {                while(messageCount-->0){                        ctx.writeAndFlush(new TextWebSocketFrame("[server] the random value is : "+random.nextInt(20)));                                                try {                                Thread.sleep(1000);                        } catch (InterruptedException e) {                                logger.error("encounter an exception",e);                        }                }        }}

websocket.server.HttpRequestHandler.java

package websocket.server;import io.netty.channel.ChannelHandlerContext;import io.netty.channel.SimpleChannelInboundHandler;import io.netty.handler.codec.http.FullHttpRequest;import org.apache.log4j.Logger;public class HttpRequestHandler extends SimpleChannelInboundHandler {        private final String wsUri;        public HttpRequestHandler(String wsUri) {        this.wsUri = wsUri;    }        private Logger logger = Logger.getLogger(HttpRequestHandler.class);        @Override    protected void channelRead0(final ChannelHandlerContext ctx, FullHttpRequest msg)            throws Exception {                    if(wsUri.equalsIgnoreCase(msg.getUri())){                logger.info("a websocket connection established ... ");                logger.info("the request uri is : "+msg.getUri());                                new RandomResponseGenerator(ctx).start();                            ctx.fireChannelRead(msg.retain());        }    }}

websocket.server.TextWebSocketFrameHandler.java

package websocket.server;import io.netty.channel.ChannelHandlerContext;import io.netty.channel.SimpleChannelInboundHandler;import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;import org.apache.log4j.Logger;public class TextWebSocketFrameHandler extends SimpleChannelInboundHandler {        private Logger logger = Logger.getLogger(TextWebSocketFrameHandler.class);        @Override    protected void channelRead0(ChannelHandlerContext ctx,            TextWebSocketFrame msg) throws Exception {            String message = msg.content().toString(io.netty.util.CharsetUtil.UTF_8);            logger.info("receive below information from client:\n"+message);                        ctx.writeAndFlush(new TextWebSocketFrame("[server] receive message ["+message+"] successfully"));    }}

websocket.server.WebSocketServerInitializer.java

package websocket.server;import io.netty.channel.Channel;import io.netty.channel.ChannelInitializer;import io.netty.channel.ChannelPipeline;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;public class WebSocketServerInitializer extends ChannelInitializer {             @Override    protected void initChannel(Channel ch) throws Exception {        ChannelPipeline pipeline = ch.pipeline();                 pipeline.addLast(new HttpServerCodec());                 pipeline.addLast(new ChunkedWriteHandler());                 pipeline.addLast(new HttpObjectAggregator(64*1024));                 pipeline.addLast(new HttpRequestHandler("/ws"));                 pipeline.addLast(new WebSocketServerProtocolHandler("/ws"));                 pipeline.addLast(new TextWebSocketFrameHandler());             } }

pom.xml

                                                        log4j                        log4j                        1.2.14                                                        commons-logging                        commons-logging                        1.1.1                                                                        io.netty                        netty-all                        4.0.29.Final                                        


使用HTML5作为websocket前端实现

index.html

Insert title here        

输出:


0