WebSocket

WebSocketConfig.java

/**
 * WebSocket配置类
 * @author admin
 */
@Configuration
public class WebSocketConfig {

    /**
     * 注入一个ServerEndpointExporter,该Bean会自动注册使用@ServerEndpoint注解申明的websocket endpoint
     * @return
     */
    @Bean
    public ServerEndpointExporter serverEndpointExporter(){
        return new ServerEndpointExporter();
    }
}

WebSocketServer.java

/**
 * websocket双通道
 *
 * @author admin
 */
@Slf4j
@Component
@ServerEndpoint(value = "/imserver/{username}")
public class WebSocketServer {

    /**
     * 记录当前在线连接者
     */
    public static final Map<String, Session> sessionMap = new ConcurrentHashMap<>();

    /**
     * 连接成功调用的方法
     */
    @OnOpen
    public void onOpen(Session session, @PathParam("username") String username) {
        sessionMap.put(username, session);
        log.info("有新用户加入,username={},当前在线人数:{}", username, sessionMap.size());
        sendAllMessage("有新连接加入");
    }

    /**
     * 连接关闭调用的方法
     */
    @OnClose
    public void onClose(Session session, @PathParam("username") String username) {
        sessionMap.remove(username);
        log.info("有一个连接关闭,移除username={}的用户session,当前在线人数:{}", username, sessionMap.size());
    }

    /**
     * 收到客户端消息后调用的方法
     *
     * @param message
     * @param session
     * @param username
     */
    @OnMessage
    public void onMessage(String message, Session session, @PathParam("username") String username) {
        log.info("服务端收到用户username={}的消息:{}", username, message);
//        JSONObject jsonObject = JSONObject.parseObject(message);
//        String toUsername = jsonObject.getString("to");
//        String text = jsonObject.getString("text");
//        Session toSession = sessionMap.get(toUsername);
//        if (Objects.nonNull(toSession)) {
//            JSONObject object = new JSONObject();
//            object.put("from", username);
//            object.put("text", text);
//            this.sendMessage(toSession, object.toJSONString());
//        } else {
//            log.info("发送失败未找到用户username={}的session", toUsername);
//        }

        // 自动返回消息
        if (Objects.nonNull(session)) {
            String newMessage = "服务器已成功接收到消息:[" + message + "],并坏笑一声!";
            this.sendMessage(session, newMessage);
        }
    }

    @OnError
    public void onError(Session session, Throwable error) {
        log.error("Websocket发生错误");
        error.printStackTrace();
    }

    /**
     * 服务端发送消息给所有客户端
     */
    public void sendAllMessage(String message) {
        try {
            for (Session session : sessionMap.values()) {
                log.info("服务端给客户端[{}]发送消息{}", session.getId(), message);
                session.getBasicRemote().sendText(message);
            }
        } catch (Exception e) {
            log.error("服务端发送消息给客户端失败", e);
        }
    }

    /**
     * 给某个用户发送消息
     */
    public void sendMessage(Session toSession, String message) {
        try {
            toSession.getBasicRemote().sendText(message);
        } catch (Exception e) {
            log.info("服务端发送消息各客户端失败", e);
        }
    }

}

WebSocketClinet.java

待补充。

posted @ 2022-07-10 22:10  生生灯火半杯月  阅读(67)  评论(0)    收藏  举报