springboot集成webSocket 通过javax的方式实现

pom.xml导入的包

    
        org.springframework.boot
        spring-boot-starter-websocket
    
    
        javax-websocket
        javax-websocket-api
    

WebSocketConfig.java

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;

/**
 * Description
 * 

* WebSocket协议配置 *

* DATE 2019/5/8 * * @author sun */ @Configuration public class WebSocketConfig { @Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); }

WebSocketServerUtil.java


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;
/**
 * Description
 * 

* WebSocket推送消息类 *

* DATE 2019/5/8 * * @author sunjiahui */ @ServerEndpoint("/websocket/{userId}") @Component public class WebSocketServerUtil { private static final Logger log= LoggerFactory.getLogger(WebSocketServerUtil.class); //静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。 private static int onlineCount = 0; private static ConcurrentHashMap webSocketMap= new ConcurrentHashMap<>(); //与某个客户端的连接会话,需要通过它来给客户端发送数据 private Session session; //用来区分不同的客户端连接标识 private String currentUser=""; /** * 连接建立成功调用的方法*/ @OnOpen public void onOpen(@PathParam("userId") String userId, Session session) { this.session = session; currentUser=userId; webSocketMap.put(currentUser,this); addOnlineCount(); //在线数加1 log.info("有新连接加入!当前在线人数为" + getOnlineCount()); log.info("session={}|||userId={}" ,session,userId); try { sendMessage("连接成功"); } catch (IOException e) { log.error("websocket IO异常"); } } /** * 连接关闭调用的方法 */ @OnClose public void onClose() { if (!currentUser.equals("")) { webSocketMap.remove(currentUser); subOnlineCount(); //在线数减1 log.info("有一连接关闭!当前在线人数为" + getOnlineCount()); } } /** * 收到客户端消息后调用的方法 * * @param message 客户端发送过来的消息*/ @OnMessage public void onMessage(String message, Session session) { log.info("来自客户端的消息:" + message); } /** * * @param session * @param error */ @OnError public void onError(Session session, Throwable error) { log.error("发生错误"); error.printStackTrace(); } public void sendMessage(String message) throws IOException { this.session.getBasicRemote().sendText(message); } /** * 向指定用户推送消息(主要监听井盖状态发生异常) * @param message //消息内容 * @param messageUserId //消息接收人 */ public static void sendToUser(String message,String messageUserId) { try { //判断消息接收人是否在线 if (webSocketMap.get(messageUserId) != null) { webSocketMap.get(messageUserId).sendMessage(message); } else { log.error("当前用户不在线"); } } catch (IOException e) { e.printStackTrace(); } } /** * 群发自定义消息(主要监听新增井盖) * */ public static void sendToAll(String message) { log.info("sendToAll(),message={}",message); for (String key : webSocketMap.keySet()) { try { webSocketMap.get(key).sendMessage(message); } catch (IOException e) { e.printStackTrace(); } } } public static synchronized int getOnlineCount() { return onlineCount; } public static synchronized void addOnlineCount() { WebSocketServerUtil.onlineCount++; } public static synchronized void subOnlineCount() { WebSocketServerUtil.onlineCount--; } }

前端js代码




    
    	<>
        
        WebSocket 客户端
    

    
        

参考文章:https://blog.csdn.net/zhangdehua678/article/details/78913839/

参考文章中没加入javax-websocket包,导致我调试过程中浏览器一直报404。所以一定要加入javax-websocket包。

你可能感兴趣的:(Util)