Netty4 之 简单搭建WebSocket服务
websocket.server.RandomResponseGenerator.java
packagewebsocket.server;importio.netty.channel.ChannelHandlerContext;importio.netty.handler.codec.http.websocketx.TextWebSocketFrame;importjava.util.Random;importorg.apache.log4j.Logger;publicclassRandomResponseGeneratorextendsThread{privateChannelHandlerContextctx;privateRandomrandom=newRandom();privateintmessageCount=10;publicRandomResponseGenerator(ChannelHandlerContextctx){this.ctx=ctx;}privateLoggerlogger=Logger.getLogger(RandomResponseGenerator.class);publicvoidrun(){while(messageCount-->0){ctx.writeAndFlush(newTextWebSocketFrame("[server]therandomvalueis:"+random.nextInt(20)));try{Thread.sleep(1000);}catch(InterruptedExceptione){logger.error("encounteranexception",e);}}}}
websocket.server.HttpRequestHandler.java
packagewebsocket.server;importio.netty.channel.ChannelHandlerContext;importio.netty.channel.SimpleChannelInboundHandler;importio.netty.handler.codec.http.FullHttpRequest;importorg.apache.log4j.Logger;publicclassHttpRequestHandlerextendsSimpleChannelInboundHandler<FullHttpRequest>{privatefinalStringwsUri;publicHttpRequestHandler(StringwsUri){this.wsUri=wsUri;}privateLoggerlogger=Logger.getLogger(HttpRequestHandler.class);@OverrideprotectedvoidchannelRead0(finalChannelHandlerContextctx,FullHttpRequestmsg)throwsException{if(wsUri.equalsIgnoreCase(msg.getUri())){logger.info("awebsocketconnectionestablished...");logger.info("therequesturiis:"+msg.getUri());newRandomResponseGenerator(ctx).start();ctx.fireChannelRead(msg.retain());}}}
websocket.server.TextWebSocketFrameHandler.java
packagewebsocket.server;importio.netty.channel.ChannelHandlerContext;importio.netty.channel.SimpleChannelInboundHandler;importio.netty.handler.codec.http.websocketx.TextWebSocketFrame;importorg.apache.log4j.Logger;publicclassTextWebSocketFrameHandlerextendsSimpleChannelInboundHandler<TextWebSocketFrame>{privateLoggerlogger=Logger.getLogger(TextWebSocketFrameHandler.class);@OverrideprotectedvoidchannelRead0(ChannelHandlerContextctx,TextWebSocketFramemsg)throwsException{Stringmessage=msg.content().toString(io.netty.util.CharsetUtil.UTF_8);logger.info("receivebelowinformationfromclient:\n"+message);ctx.writeAndFlush(newTextWebSocketFrame("[server]receivemessage["+message+"]successfully"));}}
websocket.server.WebSocketServerInitializer.java
packagewebsocket.server;importio.netty.channel.Channel;importio.netty.channel.ChannelInitializer;importio.netty.channel.ChannelPipeline;importio.netty.handler.codec.http.HttpObjectAggregator;importio.netty.handler.codec.http.HttpServerCodec;importio.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;importio.netty.handler.stream.ChunkedWriteHandler;publicclassWebSocketServerInitializerextendsChannelInitializer<Channel>{@OverrideprotectedvoidinitChannel(Channelch)throwsException{ChannelPipelinepipeline=ch.pipeline();pipeline.addLast(newHttpServerCodec());pipeline.addLast(newChunkedWriteHandler());pipeline.addLast(newHttpObjectAggregator(64*1024));pipeline.addLast(newHttpRequestHandler("/ws"));pipeline.addLast(newWebSocketServerProtocolHandler("/ws"));pipeline.addLast(newTextWebSocketFrameHandler());}}
pom.xml
<dependencies><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.14</version></dependency><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.1.1</version></dependency><dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><version>4.0.29.Final</version></dependency></dependencies>
使用HTML5作为websocket前端实现
index.html
<!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>Inserttitlehere</title></head><body><scripttype="text/javascript">varsocket;if(!window.WebSocket){window.WebSocket=window.MozWebSocket;}if(window.WebSocket){socket=newWebSocket("ws://localhost:8844/ws");socket.onmessage=function(event){varta=document.getElementById('responseText');ta.value=ta.value+'\n'+event.data};socket.onopen=function(event){varta=document.getElementById('responseText');ta.value="连接开启!";};socket.onclose=function(event){varta=document.getElementById('responseText');ta.value=ta.value+"连接被关闭";};}else{alert("你的浏览器不支持!");}functionsend(message){if(!window.WebSocket){return;}if(socket.readyState==WebSocket.OPEN){socket.send(message);}else{alert("连接没有开启.");}}</script><formonsubmit="returnfalse;"><inputtype="text"name="message"value="Hello,World!"><inputtype="button"value="发送消息"onclick="send(this.form.message.value)"><h4>输出:</h4><textareaid="responseText"></textarea><inputtype="button"onclick="javascript:document.getElementById('responseText').value=''"value="清空"></form></body></html>
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。