netty websocket 后台消息推送

 

websocket server端的代码:

  1. public class WebSocketServer {  
  2.   
  3.     private final int port;  
  4.     public static ChannelHandlerContext ctx = null;  
  5.       
  6.     public WebSocketServer(int port) {  
  7.         this.port = port;  
  8.     }  
  9.   
  10.     public void run() {  
  11.         // Configure the server.  
  12.         ServerBootstrap bootstrap = new ServerBootstrap(new NioServerSocketChannelFactory(  
  13.                 Executors.newCachedThreadPool(), Executors.newCachedThreadPool()));  
  14.   
  15.         // Set up the event pipeline factory.  
  16.         bootstrap.setPipelineFactory(new WebSocketServerPipelineFactory());  
  17.   
  18.         // Bind and start to accept incoming connections.  
  19.         bootstrap.bind(new InetSocketAddress(port));  
  20.   
  21.         System.out.println("Web socket server started at port " + port + '.');  
  22.         System.out.println("Open your browser and navigate to http://localhost:" + port + '/');  
  23.     }  
  24.   
  25.     public static void main(String[] args) {  
  26.         int port;  
  27.         if (args.length > 0) {  
  28.             port = Integer.parseInt(args[0]);  
  29.         } else {  
  30.             port = 8080;  
  31.         }  
  32.         new WebSocketServer(port).run();  
  33.           
  34.           
  35.         try {  
  36.             Thread.sleep(30000);  
  37.               
  38.             while(true) {  
  39.                   
  40.                 if (ctx != null && ctx.getChannel().isWritable()) {  
  41.                     ctx.getChannel().write(new TextWebSocketFrame("1"));  
  42.                 }  
  43.                   
  44.                 Thread.sleep(3000);  
  45.                 if (ctx != null && ctx.getChannel().isWritable()) {  
  46.                     ctx.getChannel().write(new TextWebSocketFrame("2"));  
  47.                 }  
  48.                   
  49.                 Thread.sleep(3000);  
  50.                 if(ctx != null && ctx.getChannel().isWritable()) {  
  51.                     ctx.getChannel().write(new TextWebSocketFrame("3"));  
  52.                     Thread.sleep(3000);  
  53.                 }  
  54.             }  
  55.         } catch(Exception e) {  
  56.             e.printStackTrace();  
  57.         }  
  58.     }  
  59. }  
  60.   
  61. package com.test.websocket;  
  62.   
  63. import org.jboss.netty.channel.ChannelHandlerContext;  
  64. import org.jboss.netty.channel.ExceptionEvent;  
  65. import org.jboss.netty.channel.MessageEvent;  
  66. import org.jboss.netty.channel.SimpleChannelUpstreamHandler;  
  67. import org.jboss.netty.handler.codec.http.HttpRequest;  
  68. import org.jboss.netty.handler.codec.http.websocketx.CloseWebSocketFrame;  
  69. import org.jboss.netty.handler.codec.http.websocketx.WebSocketFrame;  
  70. import org.jboss.netty.handler.codec.http.websocketx.WebSocketServerHandshaker;  
  71. import org.jboss.netty.handler.codec.http.websocketx.WebSocketServerHandshakerFactory;  
  72. import org.jboss.netty.logging.InternalLogger;  
  73. import org.jboss.netty.logging.InternalLoggerFactory;  
  74.   
  75. import static org.jboss.netty.handler.codec.http.HttpHeaders.Names.*;  
  76.   
  77. /** 
  78.  * Handles handshakes and messages 
  79.  */  
  80. public class WebSocketServerHandler extends SimpleChannelUpstreamHandler {  
  81.     private static final InternalLogger logger = InternalLoggerFactory.getInstance(WebSocketServerHandler.class);  
  82.   
  83.     private static final String WEBSOCKET_PATH = "/websocket";  
  84.   
  85.     private WebSocketServerHandshaker handshaker;  
  86.   
  87.     @Override  
  88.     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {  
  89.         Object msg = e.getMessage();  
  90.         if (msg instanceof HttpRequest) {  
  91.             handleHttpRequest(ctx, (HttpRequest) msg);  
  92.         } else if (msg instanceof WebSocketFrame) {  
  93.             handleWebSocketFrame(ctx, (WebSocketFrame) msg);  
  94.         }  
  95.     }  
  96.   
  97.     private void handleHttpRequest(ChannelHandlerContext ctx, HttpRequest req) throws Exception {  
  98.   
  99.         // Handshake  
  100.         WebSocketServerHandshakerFactory wsFactory = new WebSocketServerHandshakerFactory(  
  101.                 getWebSocketLocation(req), nullfalse);  
  102.         handshaker = wsFactory.newHandshaker(req);  
  103.         if (handshaker == null) {  
  104.             wsFactory.sendUnsupportedWebSocketVersionResponse(ctx.getChannel());  
  105.         } else {  
  106.             handshaker.handshake(ctx.getChannel(), req).addListener(WebSocketServerHandshaker.HANDSHAKE_LISTENER);  
  107.         }  
  108.           
  109.         WebSocketServer.ctx = ctx;  
  110.     }  
  111.   
  112.     private void handleWebSocketFrame(ChannelHandlerContext ctx, WebSocketFrame frame) {  
  113.   
  114.         // Check for closing frame  
  115.         if (frame instanceof CloseWebSocketFrame) {  
  116.             handshaker.close(ctx.getChannel(), (CloseWebSocketFrame) frame);  
  117.               
  118.             WebSocketServer.ctx = null;  
  119.             return;  
  120.         }  
  121.     }  
  122.       
  123.     @Override  
  124.     public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception {  
  125.         e.getCause().printStackTrace();  
  126.         e.getChannel().close();  
  127.           
  128.         WebSocketServer.ctx = null;  
  129.     }  
  130.   
  131.     private static String getWebSocketLocation(HttpRequest req) {  
  132.         return "ws://" + req.getHeader(HOST) + WEBSOCKET_PATH;  
  133.     }  
  134. }  
  135.   
  136. package com.test.websocket;  
  137.   
  138. import static org.jboss.netty.channel.Channels.*;  
  139.   
  140. import org.jboss.netty.channel.ChannelPipeline;  
  141. import org.jboss.netty.channel.ChannelPipelineFactory;  
  142. import org.jboss.netty.handler.codec.http.HttpChunkAggregator;  
  143. import org.jboss.netty.handler.codec.http.HttpRequestDecoder;  
  144. import org.jboss.netty.handler.codec.http.HttpResponseEncoder;  
  145.   
  146. /** 
  147.  */  
  148. public class WebSocketServerPipelineFactory implements ChannelPipelineFactory {  
  149.     public ChannelPipeline getPipeline() throws Exception {  
  150.         // Create a default pipeline implementation.  
  151.         ChannelPipeline pipeline = pipeline();  
  152.         pipeline.addLast("decoder"new HttpRequestDecoder());  
  153.         pipeline.addLast("aggregator"new HttpChunkAggregator(65536));  
  154.         pipeline.addLast("encoder"new HttpResponseEncoder());  
  155.         pipeline.addLast("handler"new WebSocketServerHandler());  
  156.         return pipeline;  
  157.     }  
  158. }  

web Js代码

[javascript] view plain copy 在CODE上查看代码片 派生到我的代码片
  1. function connect() {  
  2.     var socket;  
  3.     if (!window.WebSocket) {  
  4.         window.WebSocket = window.MozWebSocket;  
  5.     }  
  6.   
  7.     if (window.WebSocket) {  
  8.         socket = new WebSocket("ws://192.168.2.72:8080/websocket");  
  9.         socket.onmessage = function(event) {  
  10.             var ta = document.getElementById('responseText');  
  11.             ta.innerHTML = event.data;  
  12.         };  
  13.     
  14.         socket.onopen = function(event) {  
  15.             var ta = document.getElementById('responseText');  
  16.             ta.innerHTML = "Web Socket opened!";  
  17.         };  
  18.         
  19.         socket.onclose = function(event) {  
  20.             var ta = document.getElementById('responseText');  
  21.             ta.innerHTML = "Web Socket closed";   
  22.         };  
  23.     } else {  
  24.         alert("Your browser does not support Web Socket.");  
  25.     }  
  26. }  
  27.   
  28. $(document).ready(function(){      
  29.     connect();  
  30. }); 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值