springMVC实现websocket

转载:https://blog.csdn.net/rola0418/article/details/79315607

简单发布一个基于springMVC的websocket的实现配置,springMVC的搭建过程这里就不说明了 。只实现H5的websocket,js实现没有考虑

springMVC的配置文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:websocket="http://www.springframework.org/schema/websocket"
xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
        http://www.springframework.org/schema/websocket 
        http://www.springframework.org/schema/websocket/spring-websocket-4.3.xsd">
        
    <!-- 连接处理的句柄,用于接收消息,推送消息,根据自己来实现需求 -->
    <bean id="systemWebSocketHandler" class="com.golden.socket.handler.SystemWebSocketHandler"/>
    <!-- allowed-origins="*" 声明支持跨域 -->
    <websocket:handlers allowed-origins="*">
            <!-- path属性就是声明websocket的服务连接点。如:访问时HTTP://ip:端口/web名称/servers.do-->
    <websocket:mapping path="/servers" handler="systemWebSocketHandler"/>  
            <websocket:handshake-interceptors>  
        <!-- 连接拦截器,用于连接之前 ,之后做下业务处理-->
            <bean class="com.golden.socket.interceptor.WebSocketInterceptor"/>  
            </websocket:handshake-interceptors> 
    </websocket:handlers>
</beans>
WebSocketInterceptor类,配置文件中的拦截器
package com.golden.socket.interceptor;


import java.util.Map;
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 com.golden.socket.consts.SocketConst;


/**
 * 连接成功,会调用这个拦截器 
 */
public class WebSocketInterceptor implements HandshakeInterceptor{
/**
* 连接后会调用这个方法
*/
@Override
public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler webSocketHandler, Exception e) {
System.out.println("WebSocketInterceptor 执行");

}
/**
* 第一次连接会调用这个方法 
* 参数params 会自动添加到 WebSocketSession
* loginKey 登录socket-web的标识,用于区分登录身份
*/
@Override
public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler webSocketHandler,
Map<String, Object> params) throws Exception {
ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) request;
String loginKey = (String)servletRequest.getServletRequest().getParameter(SocketConst.LOGIN_KEY);
params.put(SocketConst.LOGIN_KEY, loginKey);
         return true;
}

}
SystemWebSocketHandler类, 配置文件中的systemWebSocketHandler
package com.golden.socket.handler;


import java.util.Map;


import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.WebSocketMessage;
import org.springframework.web.socket.WebSocketSession;


import com.golden.socket.consts.SocketConst;
import com.golden.socket.users.SocketUser;


/**
 * 消息服务类
 */
public class SystemWebSocketHandler implements WebSocketHandler {

/**
* 拦截器拦截第一次连接后会调用这个方法 
* 业务实现:登录后,将用户存入缓存
*/
    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
    Map<String, Object> param = session.getAttributes();
    String loginKey = param.get(SocketConst.LOGIN_KEY).toString();
    SocketUser.put(loginKey, session);
    }
    /**
     * 连接的用户,通过这个方法发送消息会调用这个方法 
     */
    @Override
    public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {
    //页面发送的消息,会传到该方法中。
    }
    /**
     * 心跳检测发现连接不上会调用这个方法,之后会调用连接关闭的方法
     * 业务实现:删除session
     */
    @Override
    public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
    Map<String, Object> param = session.getAttributes();
    String loginKey = param.get(SocketConst.LOGIN_KEY).toString();
    SocketUser.remove(loginKey, session);
    }
    /**
     * 关闭连接会调用这个方法 ,这个关闭会由两个地方触发,一个是浏览器主动退出,还有一个是心跳检测发现连接不上也会调用这个方法。
     * 业务实现:发送XX退出消息
     */
    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {
    }
 
    @Override
    public boolean supportsPartialMessages() {
        return false;
    }
 
}
js 端
var MyWebSocket = function (){
var websocket;
if ('WebSocket' in window) {
    websocket = new WebSocket("ws://IP:端口/socket-web/servers?loginKey=sss");
} else if ('MozWebSocket' in window) {
        websocket = new MozWebSocket("ws://IP:端口/socket-web/servers");
    }else {
    return
}
websocket.onopen = function (event) {
//messageFactory.receiveMessage(JSON.parse(event.data))
};
websocket.onmessage = function (event) {
$("#sysContent").html(event.data);
if(!$("#sysMessage").is(":hidden")){
$("#sysMessage").slideUp(1500)
}
$("#sysMessage").slideDown(1500);
};
websocket.onerror = function (event) {
};
websocket.onclose = function (event) {
alert("您已被踢下线");
};
return websocket;
}


$(function (){
var ws = new MyWebSocket();
ws.send("这是我发送的方法");//这个内容会发送到 SystemWebSocketHandler类的 handleMessage方法中
})


WebSocketSession 类说明
这个类可以被看做是传统的web服务器的session。每次连接都会创建一个session,关闭页面就是断开了连接。再连接就会是全新的session。所以再实现功能时,要管理好自己的session.


以上是简单的通讯。具体逻辑和复杂场景需要参考很多知识点,真实场景可能要考虑消息格式的约定,可能需要登录队列,考虑线程,负载等问题。这个只是demo,用于初学者学习
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring MVC可以很方便地集成WebSocket,以下是实现WebSocket的步骤: 1.添加依赖 在pom.xml文件中添加以下依赖: ``` <dependency> <groupId>org.springframework</groupId> <artifactId>spring-websocket</artifactId> <version>${spring.version}</version> </dependency> ``` 2.配置WebSocket 在Spring MVC的配置文件中添加以下配置: ``` @Configuration @EnableWebSocket public class WebSocketConfig implements WebSocketConfigurer { @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(new WebSocketHandler(), "/websocket").setAllowedOrigins("*"); } } ``` 其中,WebSocketHandler是自定义的一个处理器类,"/websocket"是WebSocket的访问路径,setAllowedOrigins("*")表示允许跨域访问。 3.编写WebSocket处理器 编写一个WebSocket处理器类,实现WebSocketHandler接口,并重写以下方法: - afterConnectionEstablished:当WebSocket连接建立成功时调用该方法。 - handleMessage:当接收到客户端发送的WebSocket消息时调用该方法。 - handleTransportError:当WebSocket通信发生错误时调用该方法。 - afterConnectionClosed:当WebSocket连接关闭时调用该方法。 例如: ``` public class WebSocketHandler implements WebSocketHandler { @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { System.out.println("WebSocket连接建立成功"); } @Override public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception { System.out.println("接收到消息:" + message.getPayload()); session.sendMessage(new TextMessage("收到消息:" + message.getPayload())); } @Override public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception { System.out.println("WebSocket通信发生错误"); } @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception { System.out.println("WebSocket连接已关闭:" + closeStatus); } @Override public boolean supportsPartialMessages() { return false; } } ``` 4.使用WebSocket 在前端页面中,使用JavaScript创建WebSocket对象,并指定WebSocket的访问路径: ``` var socket = new WebSocket("ws://localhost:8080/websocket"); ``` 然后,可以通过WebSocket对象发送和接收消息: ``` // 发送消息 socket.send("Hello, WebSocket!"); // 接收消息 socket.onmessage = function(event) { console.log("接收到消息:" + event.data); }; ``` 这样,就可以利用Spring MVC实现WebSocket了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值