基于spring框架来写的,websocket实时推送例子,具体内容如下
第一步:自己搭建一个springmvc项目,很简单,网上百度都有;pom文件添加以下:
org.springframework spring-websocket4.2.4.RELEASE org.springframework spring-messaging4.2.4.RELEASE
我的spring版本是4.2.4的,所以websocket也是4.2.4的;websocket最好和spring版本保持一致
第二步:编写消息处理器
package com.zsy.websocket;
import java.io.IOException;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.WebSocketMessage;
import org.springframework.web.socket.WebSocketSession;
public class MyMessageHandler implements WebSocketHandler {
//用户key
public static final String USER_KEY = "current_user";
private final static Map userMap;
static {
userMap = new ConcurrentHashMap(30);
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
String userId = this.getUserId(session);
if(StringUtils.isNoneBlank(userId)){
userMap.remove(userId);
System.err.println("该" + userId +"用户已成功关闭");
}else{
System.err.println("关闭时,获取用户id为空");
}
}
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
String userId = this.getUserId(session);
if(StringUtils.isNoneBlank(userId)){
userMap.put(userId, session);
session.sendMessage(new TextMessage("建立WebSocket连接成功!"));
}
}
@Override
public void handleMessage(WebSocketSession session, WebSocketMessage> message) throws Exception {
String msg = message.toString();
String userId = this.getUserId(session);
System.err.println("该"+userId+"用户发送的消息是:"+msg);
message = new TextMessage("服务端已经接收到消息,msg="+msg);
session.sendMessage(message);
}
@Override
public void handleTransportError(WebSocketSession session, Throwable e) throws Exception {
WebSocketMessage message = new TextMessage("异常信息:"+e.getMessage());
session.sendMessage(message);
}
@Override
public boolean supportsPartialMessages() {
return false;
}
public void sendMessageToUser(String userId,String contents) {
WebSocketSession session = userMap.get(userId);
if(session !=null && session.isOpen()) {
try {
TextMessage message = new TextMessage(contents);
session.sendMessage(message);
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void sendMessageToAllUsers(String contents) {
Set userIds = userMap.keySet();
for(String userId: userIds) {
this.sendMessageToUser(userId, contents);
}
}
private String getUserId(WebSocketSession session){
try {
String userId = (String)session.getAttributes().get(USER_KEY);
return userId;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
第三步:编写websocket相关配置,当然可以在xml配置;我现在没有使用xml配置,使用代码配置,需要在xml里添加扫描包
package com.zsy.websocket;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
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
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(myHandler(), "/testHandler").addInterceptors(new WebSocketInterceptor());
registry.addHandler(myHandler(), "/socketJs/testHandler").addInterceptors(new WebSocketInterceptor()).withSockJS();
}
@Bean
public WebSocketHandler myHandler(){
return new MyMessageHandler();
}
}
第四步:编写websocket适配器
package com.zsy.websocket;
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.support.HttpSessionHandshakeInterceptor;
public class WebSocketInterceptor extends HttpSessionHandshakeInterceptor {
@Override
public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,
Map attributes) throws Exception {
if(request instanceof ServletServerHttpRequest){
ServletServerHttpRequest serverHttpRequest = (ServletServerHttpRequest)request;
//获取参数
String userId = serverHttpRequest .getServletRequest().getParameter("userId");
attributes.put(MyMessageHandler.USER_KEY, userId);
}
return true;
}
}
第五步对应的js:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>Insert title here
第六步测试:
package com.zsy.test.controller;
import java.util.HashMap;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.zsy.websocket.MyMessageHandler;
@Controller
public class TestController {
@Autowired
MyMessageHandler handler;
@RequestMapping("/get")
public String get(){
return "index";
}
@ResponseBody
@RequestMapping("/get1")
public String send(String name){
handler.sendMessageToUser("zhaoshouyun", "服务端发送的内容:"+name);
return "success";
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持考高分网。



