web.xml
- <servlet>
- <servlet-name>WebSocket</servlet-name>
- <servlet-class> com.utils.Tomcat7WebSocket</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>WebSocket</servlet-name>
- <url-pattern>/websocket/*</url-pattern>
- </servlet-mapping>
struts.xml
//防止struts自动拦截
- <constant name="struts.action.excludePattern" value="ws://*,wss://*,/websocket*,^ws://.$"/>
Tomcat7WebSocket.java(action)
//添加删除用户
- package com.utils;
- import java.io.IOException;
- import java.nio.ByteBuffer;
- import java.nio.CharBuffer;
- import java.util.concurrent.CopyOnWriteArraySet;
- import javax.servlet.http.HttpServletRequest;
- import org.apache.catalina.websocket.MessageInbound;
- import org.apache.catalina.websocket.StreamInbound;
- import org.apache.catalina.websocket.WebSocketServlet;
- import org.apache.catalina.websocket.WsOutbound;
- import org.apache.log4j.Logger;
- public class Tomcat7WebSocket extends WebSocketServlet{
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private final Logger logger = Logger.getLogger(this.getClass().getName());
- public static CopyOnWriteArraySet<MsgInbound> webSocketSet = new CopyOnWriteArraySet<MsgInbound>();
- private static int onlineCount = 0;
- @Override
- protected StreamInbound createWebSocketInbound(String arg0, HttpServletRequest arg1) {
- // TODO Auto-generated method stub
- logger.info("createWebSocketInbound");
- return new MsgInbound();
- }
- public class MsgInbound extends MessageInbound{
- protected void onClose(int status){
- webSocketSet.remove(this); //从set中删除
- subOnlineCount(); //在线数减1
- // logger.info("有一连接关闭!当前在线人数为" + getOnlineCount());
- super.onClose(status);
- }
- protected void onOpen(WsOutbound outbound){
- webSocketSet.add(this); //加入set中
- addOnlineCount(); //在线数加1
- // logger.info("有新连接加入!当前在线人数为" + getOnlineCount());
- super.onOpen(outbound);
- }
- @Override
- protected void onBinaryMessage(ByteBuffer arg0) throws IOException {
- // TODO Auto-generated method stub
- }
- @Override
- protected void onTextMessage(CharBuffer message) throws IOException {
- WsOutbound outbound=this.getWsOutbound();
- outbound.writeTextMessage(message);
- outbound.flush();
- }
- public synchronized void addOnlineCount() {
- Tomcat7WebSocket.onlineCount++;
- }
- public synchronized void subOnlineCount() {
- Tomcat7WebSocket.onlineCount--;
- }
- public synchronized int getOnlineCount() {
- return onlineCount;
- }
- }
- }
StartupListener.java
//推送信息线程
- package com.common.utils;
- import java.nio.CharBuffer;
- import org.apache.log4j.Logger;
- import org.springframework.beans.BeansException;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.ApplicationContextAware;
- import org.springframework.stereotype.Component;
- import com.common.utils.Tomcat7WebSocket.MsgInbound;
- @Component
- public class StartupListener implements ApplicationContextAware {
- public Logger logger = Logger.getLogger(this.getClass().getName());
- @Override
- public void setApplicationContext(ApplicationContext arg0) throws BeansException {
- RunTask r = new RunTask();
- r.start();
- }
- class RunTask extends Thread{
- public void run(){
- int count = 0 ;
- while (true) {
- try {
- Thread .sleep(5000);//睡5秒
- String str =""; if( 业务逻辑) str ="发送信息";
- for(MsgInbound item: Tomcat7WebSocket.webSocketSet){
- try {
- CharBuffer charBuf = CharBuffer.wrap(str.toCharArray());
- item.onTextMessage(charBuf);
- //将websocket传过来的值返回回去
- } catch (Exception e) {
- logger.error("[while]"+e.getMessage(),e);
- Tomcat7WebSocket.webSocketSet.remove(item);
- }
- }
- count =count+1;
- } catch (Exception e) {
- logger.error("[RunTask]"+e.getMessage(),e);
- }
- }
- }
- }
- }
view.html
- <!DOCTYPE html>
- <HEAD>
- </HEAD>
- <BODY>
- <div id ='mq'> </div>
- </BODY>
- <SCRIPT language=JavaScript>
- var websocket = null;
- var ipPort = window.location.host;
- //判断当前浏览器是否支持WebSocket
- if ('WebSocket' in window) {
- websocket = new WebSocket("ws://"+ipPort+"/项目/websocket");
- }
- else {
- //alert('当前浏览器 Not support websocket')
- }
- //连接发生错误的回调方法
- websocket.onerror = function () {
- // setMessageInnerHTML("WebSocket连接发生错误");
- };
- //连接成功建立的回调方法
- websocket.onopen = function () {
- // setMessageInnerHTML("WebSocket连接成功");
- }
- //接收到消息的回调方法
- websocket.onmessage = function (event) {
- setMessageInnerHTML(event.data);
- }
- //连接关闭的回调方法
- websocket.onclose = function () {
- // setMessageInnerHTML("WebSocket连接关闭");
- }
- //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
- window.onbeforeunload = function () {
- closeWebSocket();
- }
- //将消息显示在网页上
- function setMessageInnerHTML(innerHTML) {
- document.getElementById('mq').innerHTML = "<span class='pad_right' >"+innerHTML+"</span> ";
- }
- //关闭WebSocket连接
- function closeWebSocket() {
- websocket.close();
- }
- </SCRIPT>
- </html>