• 使用方式
    使用springBoot注解 @ServerEndpoint 实现websocket

  • 依赖引入

    	<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
        </dependency>
    

    注册ServerEndpointExporter bean

    	import org.springframework.context.annotation.Bean;
    	import org.springframework.context.annotation.Configuration;
    	import org.springframework.web.socket.server.standard.ServerEndpointExporter;
    
     	@Configuration
    	public class WebSocketConfig {
    	
    	    @Bean
    	    public ServerEndpointExporter serverEndpointExporter() {
    	        return new ServerEndpointExporter();
    	    }
    	}
    
  • 建立websocket链接

       	import org.springframework.stereotype.Component;
       	import org.springframework.util.CollectionUtils;
       	
       	import javax.websocket.*;
       	import javax.websocket.server.PathParam;
       	import javax.websocket.server.ServerEndpoint;
       	import java.io.IOException;
       	import java.util.HashSet;
       	import java.util.Iterator;
       	import java.util.Set;
       	import java.util.concurrent.ConcurrentHashMap;
       	
       	@ServerEndpoint(value = "/websocketTest/{userId}")
       	@Component
       	public class MyWebSocket {
       	
       	    public static ConcurrentHashMap<String, Set<Session>> sessionMap = new ConcurrentHashMap<>();
       	
       	    /**
       	     * 建立websocket连接
       	     */
       	    @OnOpen
       	    public void onOpen(@PathParam("userId") String userId, Session session) {
       	        if (CollectionUtils.isEmpty(sessionMap.get(userId))) {
       	            clearSocket();
       	            sessionMap.put(userId, new HashSet<>());
       	        }
       	        sessionMap.get(userId).add(session);
       	    }
       	
       	    /**
       	     * 连接关闭调用的方法
       	     */
       	    @OnClose
       	    public void onClose(Session session) {
       	
       	    }
       	
       	    /**
       	     * 收到消息
       	     *
       	     * @param message
       	     */
       	    @OnMessage
       	    public void onMessage(String message, Session session) throws IOException {
       	        session.getBasicRemote().sendText(message);
       	    }
       	
       	    /**
       	     * 发生错误时调用
       	     */
       	    @OnError
       	    public void onError(Session session, Throwable error) {
       	        error.printStackTrace();
       	    }
       	
       	    public void broadcastMessage(String response, Set<Session> sessionSet) {
       	        WebSocketBroadcaster.broadcastMessage(response, sessionSet);
       	    }
       	
       	    //清理session已经全部关闭的会话集合
       	    private void clearSocket() {
       	        for (String key : sessionMap.keySet()) {
       	            if (CollectionUtils.isEmpty(sessionMap.get(key))) {
       	                sessionMap.remove(key);
       	            } else {
       	                Iterator<Session> iterator = sessionMap.get(key).iterator();
       	                while (iterator.hasNext()) {
       	                    if(!iterator.next().isOpen()) {
       	                        iterator.remove();
       	                    }
       	                }
       	            }
       	        }
       	    }
       	}
    
  • 测试:测试地址 :http://www.websocket-test.com/
    在这里插入图片描述

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐