> Java > java지도 시간 > 본문

SpringBoot가 WebSocket을 통합하여 백엔드가 프런트엔드로 메시지를 보낼 수 있도록 하는 방법

WBOY
풀어 주다: 2023-05-11 14:07:12
앞으로
4254명이 탐색했습니다.

1. websocket 인터페이스는 무엇입니까?

websocket을 사용하면 서버와 클라이언트가 서로 통신할 수 있습니다. 서버에 데이터 업데이트가 있으면 이를 클라이언트에 적극적으로 푸시할 수 있습니다.

WebSocket은 클라이언트와 서버 간의 데이터 교환을 더 간단하게 만들어 서버가 클라이언트에 데이터를 적극적으로 푸시할 수 있도록 합니다. WebSocket API에서는 브라우저와 서버가 핸드셰이크만 완료하면 되며, 양방향 데이터 전송을 위해 둘 사이에 직접 지속적인 연결이 생성될 수 있습니다.
WebSocket API에서는 브라우저와 서버가 핸드셰이크 작업만 수행하면 브라우저와 서버 사이에 빠른 채널이 형성됩니다. 데이터는 둘 사이에서 직접 전송될 수 있습니다.

2. 적용 가능한 시나리오

비즈니스 개발 과정에서 일부 비동기 처리(WeChat 결제 및 Alipay 결제에 대한 결제 알림) 및 애플리케이션 간 메시징이 발생합니다.

사업 수행이 완료된 후 성공 정보를 프런트 엔드에 전달해야 합니다. 일반적인 상황에서 프런트 엔드는 백엔드의 http/https 인터페이스를 호출하여 데이터를 얻습니다. 백엔드가 메시지를 프런트 엔드에 적극적으로 푸시하려면 프런트 엔드와 백엔드 간의 통신을 위해 WebSocket을 사용해야 합니다.

3. 샘플 코드

3.1. pom.xml 종속성 추가

<!-- websocket-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
로그인 후 복사

3.2. WebSokcet 구성 클래스 만들기

@Configuration
public class WebSocketConfig {
    @Bean
    public ServerEndpointExporter serverEndpointExporter(){
        return new ServerEndpointExporter();
    }
}
3.3、创建WebSokcet工具类
 
@ServerEndpoint(value = "/websocket")
@Component
public class WebSocketServer {
    private final static Logger log = LoggerFactory.getLogger(WebSocketServer.class);
 
    //静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
    private static int onlineCount = 0;
    //concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。
    private static CopyOnWriteArraySet<WebSocketServer> webSocketSet = new CopyOnWriteArraySet<WebSocketServer>();
 
    //与某个客户端的连接会话,需要通过它来给客户端发送数据
    private Session session;
 
    /**
     * 连接建立成功调用的方法
     */
    @OnOpen
    public void onOpen(Session session) {
        this.session = session;
        //加入set中
        webSocketSet.add(this);
        //在线数加1
        addOnlineCount();
        log.info("有新连接加入!当前在线人数为" + getOnlineCount());
        try {
            MsgResponseVo userMsgResponseVo = new MsgResponseVo();
            userMsgResponseVo.setMsg("SUCCESS");
            WebSocketServer.sendInfo(JSON.toJSONString(userMsgResponseVo));
        } catch (IOException e) {
            log.error("websocket IO异常");
        }
    }
 
    /**
     * 连接关闭调用的方法
     */
    @OnClose
    public void onClose() {
        //从set中删除
        webSocketSet.remove(this);
        //在线数减1
        subOnlineCount();
        log.info("有一连接关闭!当前在线人数为" + getOnlineCount());
    }
 
    /**
     * 收到客户端消息后调用的方法
     *
     * @param message 客户端发送过来的消息
     */
    @OnMessage
    public void onMessage(String message, Session session) {
        log.info("来自客户端的消息:" + message);
 
        //群发消息
        for (WebSocketServer item : webSocketSet) {
            try {
                item.sendMessage(message);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
 
    /**
     * @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);
    }
 
    /**
     * 群发自定义消息
     */
    public static void sendInfo(String message) throws IOException {
        log.info(message);
        for (WebSocketServer item : webSocketSet) {
            try {
                item.sendMessage(message);
            } catch (IOException e) {
                continue;
            }
        }
    }
 
    public static synchronized int getOnlineCount() {
        return onlineCount;
    }
 
    public static synchronized void addOnlineCount() {
        WebSocketServer.onlineCount++;
    }
 
    public static synchronized void subOnlineCount() {
        WebSocketServer.onlineCount--;
    }
}
로그인 후 복사

3.3 테스트 webSocket

에 입력하세요. /ip: 포트/webSocket 도구 클래스의 접두사(ws://127.0.0.1:8080/websocket)

SpringBoot가 WebSocket을 통합하여 백엔드가 프런트엔드로 메시지를 보낼 수 있도록 하는 방법3.5 프런트 엔드는 WebSocket을 사용하여 백엔드 WebSocket 주소를 모니터링하고 메시지 수신 후 비즈니스 처리의 다음 단계입니다.

위 내용은 SpringBoot가 WebSocket을 통합하여 백엔드가 프런트엔드로 메시지를 보낼 수 있도록 하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:yisu.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿