struts2.3.15 WebSocketServlet简单实现

web.xml

  1.   <servlet>
  2.         <servlet-name>WebSocket</servlet-name>
  3.         <servlet-class> com.utils.Tomcat7WebSocket</servlet-class>
  4.     </servlet>
  5.     <servlet-mapping>
  6.         <servlet-name>WebSocket</servlet-name>
  7.         <url-pattern>/websocket/*</url-pattern>
  8.     </servlet-mapping> 

struts.xml

//防止struts自动拦截

  1. <constant name="struts.action.excludePattern" value="ws://*,wss://*,/websocket*,^ws://.$"/>

Tomcat7WebSocket.java(action)

//添加删除用户

  1. package com.utils;
  2. import java.io.IOException;
  3. import java.nio.ByteBuffer;
  4. import java.nio.CharBuffer;
  5. import java.util.concurrent.CopyOnWriteArraySet;
  6. import javax.servlet.http.HttpServletRequest;
  7. import org.apache.catalina.websocket.MessageInbound;
  8. import org.apache.catalina.websocket.StreamInbound;
  9. import org.apache.catalina.websocket.WebSocketServlet;
  10. import org.apache.catalina.websocket.WsOutbound;
  11. import org.apache.log4j.Logger;
  12. public class Tomcat7WebSocket extends WebSocketServlet{
  13.     /**
  14.      * 
  15.      */
  16.     private static final long serialVersionUID = 1L;
  17.     private final Logger logger = Logger.getLogger(this.getClass().getName()); 
  18.     public static CopyOnWriteArraySet<MsgInbound> webSocketSet = new CopyOnWriteArraySet<MsgInbound>();
  19.     private static int onlineCount = 0;
  20.     @Override
  21.     protected StreamInbound createWebSocketInbound(String arg0, HttpServletRequest arg1) {
  22.         // TODO Auto-generated method stub
  23.         logger.info("createWebSocketInbound");
  24.         return  new MsgInbound();
  25.     }    
  26.     public class MsgInbound extends MessageInbound{
  27.         protected void onClose(int status){  
  28.             webSocketSet.remove(this);  //从set中删除
  29.             subOnlineCount();           //在线数减1
  30. //            logger.info("有一连接关闭!当前在线人数为" + getOnlineCount());
  31.             super.onClose(status);  
  32.         }  
  33.         protected void onOpen(WsOutbound outbound){  
  34.             webSocketSet.add(this);     //加入set中
  35.             addOnlineCount();           //在线数加1
  36. //            logger.info("有新连接加入!当前在线人数为" + getOnlineCount());
  37.             super.onOpen(outbound);  
  38.         }  
  39.         @Override
  40.         protected void onBinaryMessage(ByteBuffer arg0) throws IOException {
  41.             // TODO Auto-generated method stub
  42.         }
  43.         @Override
  44.         protected void onTextMessage(CharBuffer message) throws IOException {
  45.             
  46.             WsOutbound outbound=this.getWsOutbound();
  47.             outbound.writeTextMessage(message);
  48.             outbound.flush();
  49.         }
  50.         public  synchronized void addOnlineCount() {
  51.             Tomcat7WebSocket.onlineCount++;
  52.         }
  53.         public  synchronized void subOnlineCount() {
  54.             Tomcat7WebSocket.onlineCount--;
  55.         }
  56.         public  synchronized int getOnlineCount() {
  57.             return onlineCount;
  58.         }
  59.     }
  60. }

StartupListener.java

//推送信息线程

  1. package com.common.utils;
  2. import java.nio.CharBuffer;
  3. import org.apache.log4j.Logger;
  4. import org.springframework.beans.BeansException;
  5. import org.springframework.context.ApplicationContext;
  6. import org.springframework.context.ApplicationContextAware;
  7. import org.springframework.stereotype.Component;
  8. import com.common.utils.Tomcat7WebSocket.MsgInbound;
  9. @Component
  10. public class StartupListener   implements ApplicationContextAware {
  11.     public  Logger logger = Logger.getLogger(this.getClass().getName());
  12.   
  13.     @Override
  14.     public void setApplicationContext(ApplicationContext arg0) throws BeansException {
  15.         RunTask r = new RunTask();
  16.         r.start();
  17.     }
  18.     class RunTask extends Thread{
  19.         public void run(){
  20.             int count = 0 ;
  21.             while (true) {
  22.                 try {
  23.                     Thread .sleep(5000);//睡5秒
  24.                     String str ="";         if( 业务逻辑) str  ="发送信息";
  25.                     for(MsgInbound item: Tomcat7WebSocket.webSocketSet){
  26.                         try {                 
  27.                             CharBuffer charBuf = CharBuffer.wrap(str.toCharArray());
  28.                             item.onTextMessage(charBuf);
  29.                             //将websocket传过来的值返回回去
  30.                         } catch (Exception e) {
  31.                             logger.error("[while]"+e.getMessage(),e);
  32.                             Tomcat7WebSocket.webSocketSet.remove(item);
  33.                         }
  34.                     }
  35.                     count =count+1;
  36.                 } catch (Exception e) {
  37.                     logger.error("[RunTask]"+e.getMessage(),e);
  38.                 }
  39.             }
  40.         }
  41.     }
  42. }

view.html

  1. <!DOCTYPE html>
  2. <HEAD>
  3. </HEAD>
  4. <BODY>
  5.   <div id ='mq'> </div>
  6. </BODY>
  7. <SCRIPT language=JavaScript>
  8.     var websocket = null;
  9.     var ipPort = window.location.host;
  10.     //判断当前浏览器是否支持WebSocket
  11.     if ('WebSocket' in window) {
  12.         websocket = new WebSocket("ws://"+ipPort+"/项目/websocket");
  13.     }
  14.     else {
  15.         //alert('当前浏览器 Not support websocket')
  16.     }
  17.     //连接发生错误的回调方法
  18.     websocket.onerror = function () {
  19.        // setMessageInnerHTML("WebSocket连接发生错误");
  20.     };
  21.     //连接成功建立的回调方法
  22.     websocket.onopen = function () {
  23.       // setMessageInnerHTML("WebSocket连接成功");
  24.     }
  25.     //接收到消息的回调方法
  26.     websocket.onmessage = function (event) {
  27.        setMessageInnerHTML(event.data);
  28.     }
  29.     //连接关闭的回调方法
  30.     websocket.onclose = function () {
  31.        // setMessageInnerHTML("WebSocket连接关闭");
  32.     }
  33.     //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
  34.     window.onbeforeunload = function () {
  35.         closeWebSocket();
  36.     }
  37.     //将消息显示在网页上
  38.     function setMessageInnerHTML(innerHTML) {
  39.          document.getElementById('mq').innerHTML =  "<span class='pad_right' >"+innerHTML+"</span> ";
  40.     }
  41.     //关闭WebSocket连接
  42.     function closeWebSocket() {
  43.         websocket.close();
  44.     }
  45. </SCRIPT>
  46. </html>
上一篇:Django3 channels websocket实时读取日志返回前端


下一篇:websocket系列:如何在websocket建立连接时传递参数