SpringMVC 4.3 集成webSocket

来源:互联网 发布:2016中国东盟贸易数据 编辑:程序博客网 时间:2024/05/16 01:16

SpringMVC 4.3 集成webSocket

废话不多说,直接上代码(多说一句:此配置只能在tomcat8以上的容器内运行,若降低到tomcat7.0以上,参考其他大神的帖子)。
1、项目为Spring-SpringMVC-Mybatis maven
2、SpringMVC 版本 4.3
3、开发工具 IDEA
4、json工具用的fastjson
主要修改以下配置:
- pom.xml
- 增加相关代码块
- 增加相关jsp


1、pom下增加相关依赖(spring核心依赖在此忽略)

 <!--spring websocket-->        <dependency>            <groupId>javax.websocket</groupId>            <artifactId>javax.websocket-api</artifactId>            <version>1.0</version>            <scope>provided</scope>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-websocket</artifactId>            <version>4.3.7.RELEASE</version>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-messaging</artifactId>            <version>4.3.7.RELEASE</version>        </dependency>

2、增加相关代码块
MyWebSocketInterceptor.class
注:Const.WEBSOCKET_SESSION_NAME 就是一个static final 的websocket 名字,自己定义

import com.zcglpt.base.controller.BaseController;import com.zcglpt.util.Const;import org.springframework.http.server.ServerHttpRequest;import org.springframework.http.server.ServerHttpResponse;import org.springframework.http.server.ServletServerHttpRequest;import org.springframework.web.socket.WebSocketHandler;import org.springframework.web.socket.server.HandshakeInterceptor;import java.util.Map;/** * 此类用来获取登录用户信息并交由websocket管理 * @author ts * */public class MyWebSocketInterceptor implements HandshakeInterceptor {    @Override    public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {        //将ServerHttpRequest转换成request请求相关的类,用来获取request域中的用户信息        if (request instanceof ServletServerHttpRequest) {            String userId = "";            try {            //根据实际业务自己更改,这里就是将当前登录人的唯一标识注册到websocket                userId =new BaseController().getUserId();            }catch (Exception e){                e.printStackTrace();            }            attributes.put(Const.WEBSOCKET_SESSION_NAME,userId);        }        return true;    }    @Override    public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) {    }}

WebSocketConfig.class

import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;import org.springframework.web.socket.WebSocketHandler;import org.springframework.web.socket.config.annotation.EnableWebSocket;import org.springframework.web.socket.config.annotation.WebSocketConfigurer;import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;@Configuration@EnableWebSocketpublic class WebSocketConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer {    @Override    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {        registry.addHandler(WebSocketPushHandler(),"/webSocketServer").addInterceptors(new MyWebSocketInterceptor()).setAllowedOrigins("*");    }    @Bean    public WebSocketHandler WebSocketPushHandler(){        return new WebSocketPushHandler();    }}

WebSocketPushHandler.class

import com.alibaba.fastjson.JSON;import com.zcglpt.util.Const;import org.springframework.web.socket.*;import java.io.IOException;import java.util.ArrayList;import java.util.List;import java.util.Map;/** * 消息处理类 */public class WebSocketPushHandler implements WebSocketHandler {    private static final List<WebSocketSession> users = new ArrayList<>();    //用户进入系统监听    @Override    public void afterConnectionEstablished(WebSocketSession session) throws Exception {        users.add(session);    }    //    @Override    public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {        //JSP页面发送websocket 消息是,消息会在此接收到,并转发消息格式JSON:{from:xxxx,to:xxxxx,msg:xxxxx}        TextMessage msg;        String _msg = "";        String json = (String) message.getPayload();        Map map = (Map) JSON.parse(json);        String to = map.get("to").toString();        switch (to) {            case "all":            case "All":            case "ALL":                _msg = map.get("msg").toString();                sendMessagesToUsers(new TextMessage(JSON.toJSONString(_msg)));                break;            default:                _msg = map.get("msg").toString();                sendMessageToUser(to, new TextMessage(JSON.toJSONString(_msg)));                break;        }    }    //后台错误信息处理方法    @Override    public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {    }    //用户退出后的处理    @Override    public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {        if (session.isOpen()) {            session.close();        }        users.remove(session);    }    @Override    public boolean supportsPartialMessages() {        return false;    }    /**     * 给所有的用户发送消息     */    public void sendMessagesToUsers(TextMessage message) {        for (WebSocketSession user : users) {            try {                //isOpen()在线就发送                if (user.isOpen()) {                    user.sendMessage(message);                }            } catch (IOException e) {                e.printStackTrace();            }        }    }    /**     * 发送消息给指定的用户     */    public void sendMessageToUser(String userId, TextMessage message) {        for (WebSocketSession user : users) {            if (user.getAttributes().get(Const.WEBSOCKET_SESSION_NAME).equals(userId)) {                try {                    //isOpen()在线就发送                    if (user.isOpen()) {                        user.sendMessage(message);                    }                } catch (IOException e) {                    e.printStackTrace();                }            }        }    }}

3、增加相关jsp (核心代码)
websocket.jsp

<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%><!DOCTYPE html><html><head><meta charset="utf-8"><title>主页</title><link href="${ctx}/static/module/main/css/jquery.mmenu.all.css?v=5.4.4" rel="stylesheet" type="text/css"/></head><body><div>    测试 websocket    <button class="btn btn-primary" onclick="abccd()">adasdasd</button>    </div>    <script src="${ctx}/static/js/jquery/jquery-1.11.1.min.js" type="text/javascript"></script>    <script type="text/javascript">        var  ws;        window.onload=connect;        function connect(){            if ('WebSocket' in window) {                ws = new WebSocket("ws://192.168.0.188:80/webSocketServer");<!--websocket目标服务器 ip,就是运行websocket的服务端的ip,这里最好不要写localhost,并且把ip写成公共变量(如果很多jsp都要注册websocket的话),这样其他电脑访问才能顺利连接上websocket-->            } else if ('MozWebSocket' in window) {                ws = new MozWebSocket("ws://192.168.0.188:80/webSocketServer");            }            ws.onopen = function (evnt) {                console.log("websocket连接成功");            };            ws.onmessage = function (evnt) {                eval("var dataObj="+event.data);                if(dataObj != undefined){                    console.log("websocket接收到一条新消息:");                        console.log(dataObj);                }            };            ws.onerror = function (evnt) {            };            ws.onclose = function (evnt) {            }        }        function abccd() {            console.log("推送测试");            ws.send("{\"to\":\"all\",\"msg\":\"夏XX同学:你有一条通知公告\"}");            ws.send("{\"to\":\"userId\",\"msg\":\"夏XX同学:你有一条通知公告\"}");        }    </script></body></html>

4、jsp给java controller发消息

function abccd() {            console.log("推送测试");            ws.send("{\"to\":\"all\",\"msg\":\"夏XX同学:你有一条通知公告\"}");            ws.send("{\"to\":\"userId\",\"msg\":\"夏XX同学:你有一条通知公告\"}");        }

5、controller 给jsp发消息
最好写成utils 工具类,统一封装,统一调用,减少代码量

 /**     * 向页面发送webSocket消息     * @param userId 接受人ID     * @param map 接受人ID,格式为map,自动转为json     */    public void sendMessage(String userId ,Map map){        String msg =JSON.toJSONString(map);        new WebSocketPushHandler().sendMessageToUser(userId, new TextMessage(msg));    }    /**     * 向页面发送webSocket消息     * @param userId 接受人ID     * @param json 消息,格式为json字符串     */    public void sendMessage(String userId ,String json){        String msg =JSON.toJSONString(json);        new WebSocketPushHandler().sendMessageToUser(userId, new TextMessage(msg));    }①、sendMessage("000000", JSON.toJSONString("你有两个快递到楼下了"));②、Map map =new HashMap();    map.put("name","xiaoqiang");    map.put("msg","你有两个快递到楼下了");    sendMessage("000000", map);

如此就集成完了。感谢CSDN的大神,虽然浪费了不少时间,但还是有所收货,当然不敢私藏,贡献出来,希望能帮你节省一点时间。

原创粉丝点击