SpringBoot 2.0 통합 웹 소켓 코드 인 스 턴 스

이 글 은 주로 SpringBoot 2.0 통합 웹 소켓 코드 인 스 턴 스 를 소개 합 니 다.이 글 은 예제 코드 를 통 해 매우 상세 하 게 소개 되 어 있 으 며,여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 으 므 로 필요 한 친 구 는 참고 하 실 수 있 습 니 다.
이전에 회사 의 한 시스템 이 푸 시 기술 을 실현 하기 위해 사용 한 기술 은 모두 Ajax 폴 링 이 었 다.이런 방식 으로 브 라 우 저 는 서버 에 끊임없이 요청 을 해 야 한다.그러면 대역 폭 등 자원 을 많이 낭비 할 수 있 기 때문에 WebSocket 을 연 구 했 는데 본 고 는 상세 하 게 소개 할 것 이다.
1.웹 소켓 은 무엇 입 니까?
WebSocket 은 HTML 5 가 제공 하기 시작 한 하나의 TCP 연결 에서 듀 플 렉 스 통신 을 하 는 프로 토 콜 로 서버 자원 과 대역 폭 을 더욱 절약 하고 실시 간 으로 통신 할 수 있다.
웹 소켓 은 클 라 이언 트 와 서버 간 의 데이터 교환 을 더욱 간단 하 게 만 들 고 서버 가 자발적으로 클 라 이언 트 에 데 이 터 를 전송 할 수 있 도록 합 니 다.웹 소켓 API 에서 브 라 우 저 와 서버 는 악 수 를 한 번 만 하면 영구적 인 연결 을 만 들 고 양 방향 데이터 전송 을 할 수 있 습 니 다.
2.SpringBoot 통합 웹 소켓
spring boot 프로젝트 를 새로 만 듭 니 다.spring-boot-websocket 은 다음 단계 로 작 동 합 니 다.
pom.xml jar 패키지 도입

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
새 웹 소켓 설정 클래스
이 설정 클래스 는 주석@ServerEndpoint 의 bean 을 검사 하고 등록 합 니 다.설정 클래스 코드 는 다음 과 같 습 니 다.

@Configuration
public class WebSocketConfig {
  /**
   *  spring      ServerEndpointExporter  
   *    xml:
   * <beans>
   * <bean id="serverEndpointExporter" class="org.springframework.web.socket.server.standard.ServerEndpointExporter"/>
   * </beans>
   * <p>
   *       @serverEndpoint   bean     。
   *
   * @return
   */
  @Bean
  public ServerEndpointExporter serverEndpointExporter() {
    System.out.println("     ");
    return new ServerEndpointExporter();
  }
}
새 웹 소켓 의 처리 클래스
이 처리 클래스 는@ServerEndpoint 를 사용 해 야 합 니 다.이 클래스 에서 감청 연결 의 구축 닫 기,메시지 의 수신 등 구체 적 인 코드 는 다음 과 같 습 니 다.

@ServerEndpoint(value = "/ws/asset")
@Component
public class WebSocketServer {

  @PostConstruct
  public void init() {
    System.out.println("websocket   ");
  }
  private static Logger log = LoggerFactory.getLogger(WebSocketServer.class);
  private static final AtomicInteger OnlineCount = new AtomicInteger(0);
  // concurrent      Set,            Session  。
  private static CopyOnWriteArraySet<Session> SessionSet = new CopyOnWriteArraySet<Session>();


  /**
   *            
   */
  @OnOpen
  public void onOpen(Session session) {
    SessionSet.add(session);
    int cnt = OnlineCount.incrementAndGet(); //     1
    log.info("     ,      :{}", cnt);
    SendMessage(session, "    ");
  }

  /**
   *          
   */
  @OnClose
  public void onClose(Session session) {
    SessionSet.remove(session);
    int cnt = OnlineCount.decrementAndGet();
    log.info("     ,      :{}", cnt);
  }

  /**
   *              
   *
   * @param message
   *                
   */
  @OnMessage
  public void onMessage(String message, Session session) {
    log.info("        :{}",message);
    SendMessage(session, "    ,    :"+message);

  }

  /**
   *     
   * @param session
   * @param error
   */
  @OnError
  public void onError(Session session, Throwable error) {
    log.error("    :{},Session ID: {}",error.getMessage(),session.getId());
    error.printStackTrace();
  }

  /**
   *     ,    ,       ,session     。
   * @param session
   * @param message
   */
  public static void SendMessage(Session session, String message) {
    try {
//      session.getBasicRemote().sendText(String.format("%s (From Server,Session ID=%s)",message,session.getId()));
      session.getBasicRemote().sendText(message);
    } catch (IOException e) {
      log.error("      :{}", e.getMessage());
      e.printStackTrace();
    }
  }

  /**
   *     
   * @param message
   * @throws IOException
   */
  public static void BroadCastInfo(String message) throws IOException {
    for (Session session : SessionSet) {
      if(session.isOpen()){
        SendMessage(session, message);
      }
    }
  }

  /**
   *   Session    
   * @param sessionId
   * @param message
   * @throws IOException
   */
  public static void SendMessage(String message,String sessionId) throws IOException {
    Session session = null;
    for (Session s : SessionSet) {
      if(s.getId().equals(sessionId)){
        session = s;
        break;
      }
    }
    if(session!=null){
      SendMessage(session, message);
    }
    else{
      log.warn("       ID   :{}",sessionId);
    }
  }
}
html 새로 만 들 기
현재 대부분의 브 라 우 저 는 웹 소켓 을 지원 합 니 다.예 를 들 어 Chrome,Mozilla,Opera 와 Safari 는 html 페이지 에서 웹 소켓 의 연결 을 구축 하고 메 시 지 를 받 는 감청 을 합 니 다.페이지 코드 는 다음 과 같 습 니 다.

<html>
<head>
  <meta charset="UTF-8">
  <title>websocket  </title>
  <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
  <style type="text/css">
    h3,h4{
      text-align:center;
    }
  </style>
</head>
<body>

<h3>WebSocket  ,           :</h3>

<textarea id = "messageId" readonly="readonly" cols="150" rows="30" >

</textarea>


<script type="text/javascript">
  var socket;
  if (typeof (WebSocket) == "undefined") {
    console.log("  :        WebSocket");
  } else {
    console.log("  :       WebSocket");
    //   WebSocket  
    //                  
    //  ws、wss       。           ,
    //    wss,     WebSocket   
    //ws  http、wss  https。
    socket = new WebSocket("ws://localhost:8080/ws/asset");
    //      
    socket.onopen = function() {
      console.log("Socket    ");
      socket.send("      (From Client)");
    };
    //      
    socket.onmessage = function(msg) {
      $("#messageId").append(msg.data+ "
"); console.log(msg.data ); }; // socket.onclose = function() { console.log("Socket "); }; // socket.onerror = function() { alert("Socket "); } // , window.unload=function() { socket.close(); }; } </script> </body> </html>
3.실행 효과 보기
SpringBoot 프로젝트 시작
첫 페이지 열기
로 컬 브 라 우 저 첫 페이지 열기http://localhost:8080/웹 소켓 테스트 페이지 가 나타 나 고 배경 에 연 결 된 로 그 를 인쇄 합 니 다.
연결 가입 이 있 습 니 다.현재 연결 수 는:1,session Id=0 입 니 다.
클 라 이언 트 에 메시지 보 내기
위의 로 그 를 통 해 클 라 이언 트 가 연 결 된 sessionId 를 볼 수 있 습 니 다.제 가 테스트 할 때 sessionId 는 0 이 고 브 라 우 저 는 아래 인 터 페 이 스 를 방문 하면 클 라 이언 트 에 메 시 지 를 보 낼 수 있 습 니 다.

//    : id:sessionID 
//    : message:    
http://localhost:8080/api/ws/sendOne?id=0&message=  Java   
메시지 전송 다이어그램

여기 서 SpringBoot 통합 WebSocket 의 기능 이 모두 실현 되 었 습 니 다.문제 가 있 으 면 댓 글 소통 을 환영 합 니 다!
전체 원본 주소:   https://github.com/suisui2019/springboot-study
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기