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<FullHttpRequest> { 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<TextWebSocketFrame> { 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<Channel> { @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
<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
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <script type="text/javascript"> var socket; if (!window.WebSocket) { window.WebSocket = window.MozWebSocket; } if (window.WebSocket) { socket = new WebSocket("ws://localhost:8844/ws"); socket.onmessage = function(event) { var ta = document.getElementById('responseText'); ta.value = ta.value + '\n' + event.data }; socket.onopen = function(event) { var ta = document.getElementById('responseText'); ta.value = "连接开启!"; }; socket.onclose = function(event) { var ta = document.getElementById('responseText'); ta.value = ta.value + "连接被关闭"; }; } else { alert("你的浏览器不支持!"); } function send(message) { if (!window.WebSocket) { return; } if (socket.readyState == WebSocket.OPEN) { socket.send(message); } else { alert("连接没有开启."); } } </script> <form onsubmit="return false;"> <input type="text" name="message" value="Hello, World!"><input type="button" value="发送消息" onclick="send(this.form.message.value)"> <h4>输出:</h4> <textarea id="responseText" ></textarea> <input type="button" onclick="javascript:document.getElementById('responseText').value=''" value="清空"> </form> </body> </html>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。