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