자바 웹 소켓 의 실현 및 Spring 웹 소켓 에 대한 상세 한 설명

9124 단어 자바websocket
웹 소켓 을 배우 기 시 작 했 습 니 다.페이지 에서 실시 간 으로 로그 4j 를 출력 하 는 로그 와 콘 솔 의 로 그 를 만 들 려 고 합 니 다.
먼저 기초 정 보 를 알 고 있다.
1.자바 7 은 웹 소켓 을 지원 하기 시 작 했 고 정의 만 했 을 뿐 실현 되 지 않 았 습 니 다.
2.tomcat 7 및 이상,jetty 9.1 및 이상 웹 소켓 을 실현 하 였 으 며,기타 용 기 는 연구 되 지 않 았 습 니 다.
3.spring 4.0 이상 웹 소켓 지원 추가
4.spring 은 STOMP 프로 토 콜 을 지원 하 는 웹 소켓 통신
5.WebSocket 은 자바 의 확장 으로 javax 패키지 디 렉 터 리 에 속 합 니 다.보통 이 jar 를 수 동 으로 도입 해 야 합 니 다.tomcat 를 예 로 들 면 tomcat/lib 디 렉 터 리 에서 websocket-api.jar 를 찾 을 수 있 습 니 다.
실현 되 기 시작 하 다
먼저 일반적인 WebSocket 클 라 이언 트 를 쓰 고 tomcat 디 렉 터 리 에 있 는 jar 를 직접 도입 합 니 다.주요 jar 는 websocket-api.jar,tomcat 7-websocket.jar 입 니 다.

public static void f1() {
    try {
      WebSocketContainer container = ContainerProvider.getWebSocketContainer(); //   WebSocket   ,          websocket-api.jar   ,Class.forName("org.apache.tomcat.websocket.WsWebSocketContainer");
      String uri = "ws://localhost:8081/log/log";
      Session session = container.connectToServer(Client.class, new URI(uri)); //     
      session.getBasicRemote().sendText("123132132131"); //       
      session.getBasicRemote().sendText("4564546");
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
그 중의 URL 형식 은 ws 로 시작 해 야 하 며,뒤에 등 록 된 WebSocket 주 소 를 받 아야 합 니 다.
Client.java 는 메 시 지 를 받 고 보 내 는 데 사 용 됩 니 다.

@ClientEndpoint
public class Client {

  @OnOpen
  public void onOpen(Session session) {
    System.out.println("Connected to endpoint: " + session.getBasicRemote());
  }

  @OnMessage
  public void onMessage(String message) {
    System.out.println(message);
  }

  @OnError
  public void onError(Throwable t) {
    t.printStackTrace();
  }
}

이 단계 에 이 르 러 클 라 이언 트 의 송 수신 메시지 가 완료 되 었 습 니 다.지금부터 서버 코드 를 작성 합 니 다.Spring 4.0 을 사용 합 니 다.그 중에서 pom.xml 이 너무 길 면 붙 이지 않 습 니 다.jackson,spring-websocket,spring-message 를 사용 합 니 다.

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;

import com.gionee.log.client.LogWebSocketHandler;

/**
 *     WebScoket
 * @author PengBin
 * @date 2016 6 21    5:29:00
 */
@Configuration
@EnableWebMvc
@EnableWebSocket
public class WebSocketConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer {

  @Autowired
  @Lazy
  private SimpMessagingTemplate template;

  /** {@inheritDoc} */
  @Override
  public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
    registry.addHandler(logWebSocketHandler(), "/log"); //         URL    
  }

  @Bean
  public WebSocketHandler logWebSocketHandler() {
    return new LogWebSocketHandler(template);
  }

}


import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;

/**
 * 
 * @author PengBin
 * @date 2016 6 24    6:04:39
 */
public class LogWebSocketHandler extends TextWebSocketHandler {

  private SimpMessagingTemplate template;

  public LogWebSocketHandler(SimpMessagingTemplate template) {
    this.template = template;
    System.out.println("    handler");
  }

  @Override
  protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
    String text = message.getPayload(); //          
    System.out.println("handMessage:" + text);
    // template.convertAndSend("/topic/getLog", text); //       
    session.sendMessage(message);
  }
}

이렇게 하면 일반적인 웹 소켓 이 완성 되 고 자신 은 안전 제어 등 을 통합 할 수 있다.
Spring 은 구독 과 방송 을 실현 할 수 있 는 주해 방식 도 지원 합 니 다.STOMP 형식 프로 토 콜 을 사용 합 니 다.MQ 와 유사 합 니 다.사실은 사용 하 는 MQ 메시지 형식 일 것 입 니 다.다음은 실현 입 니 다.
같은 클 라 이언 트:

public static void main(String[] args) {
    try {
      WebSocketContainer container = ContainerProvider.getWebSocketContainer();
      String uri = "ws://localhost:8081/log/hello/hello/websocket";
      Session session = container.connectToServer(Client.class, new URI(uri));
      char lf = 10; //      
      char nl = 0; //           ,   
      StringBuilder sb = new StringBuilder();
      sb.append("SEND").append(lf); //        
      sb.append("destination:/app/hello").append(lf); //      
      sb.append("content-length:14").append(lf).append(lf); //       
      sb.append("{\"name\":\"123\"}").append(nl); //    

      session.getBasicRemote().sendText(sb.toString()); //     
      Thread.sleep(50000); //      
      session.close(); //     

    } catch (Exception e) {
      e.printStackTrace();
    }
  }

여기 서 주의해 야 할 것 은 줄 바 꾸 기와 끝 기호 입 니 다.이것 은 STOMP 프로 토 콜 에 규정된 기호 입 니 다.틀 리 면 해석 할 수 없습니다.
서버 설정

/**
 *   STOMP  WebSocket  
 * @author PengBin
 * @date 2016 6 24    5:59:42
 */
@Configuration
@EnableWebMvc
@EnableWebSocketMessageBroker
public class WebSocketBrokerConfig extends AbstractWebSocketMessageBrokerConfigurer {

  /** {@inheritDoc} */
  @Override
  public void registerStompEndpoints(StompEndpointRegistry registry) {
    System.out.println("  ");
    registry.addEndpoint("/hello").withSockJS(); //     ,       /log   
    // withSockJS()    socktJS  ,       
  }

  /** {@inheritDoc} */
  @Override
  public void configureMessageBroker(MessageBrokerRegistry config) {
    System.out.println("  ");
    config.enableSimpleBroker("/topic"); // 
    config.setApplicationDestinationPrefixes("/app"); //     
  }

}

Controller

@Controller
public class LogController {

  private SimpMessagingTemplate template;

  @Autowired
  public LogController(SimpMessagingTemplate template) {
    System.out.println("init");
    this.template = template;
  }

  @MessageMapping("/hello") 
  @SendTo("/topic/greetings") //   
  public Greeting greeting(HelloMessage message) throws Exception {
    System.out.println(message.getName());
    Thread.sleep(3000); // simulated delay
    return new Greeting("Hello, " + message.getName() + "!");
  }

}

여기까지 만 하면 다 완성 이 야.

template.convertAndSend("/topic/greetings", "  "); 
//            /topic/greetings    
socktJS 로 연결 할 때/info 주소 에 대한 요청 이 있 습 니 다.
브 라 우 저 에 연결 하여 메 시 지 를 보 내 면 sockt.js 와 stomp.js 를 사용 합 니 다.

function connect() {
   var socket = new SockJS('/log/hello/hello');
   stompClient = Stomp.over(socket);
   stompClient.connect({}, function(frame) {
     setConnected(true);
     console.log('Connected: ' + frame);
     stompClient.subscribe('/topic/greetings', function(greeting) {
       showGreeting(JSON.parse(greeting.body).content);
     });
   });
 }

 function disconnect() {
   if (stompClient != null) {
     stompClient.disconnect();
   }
   setConnected(false);
   console.log("Disconnected");
 }

 function sendName() {
   var name = document.getElementById('name').value;
   stompClient.send("/app/hello", {}, JSON.stringify({
     'name' : name
   }));
 }

브 라 우 저 에서 101 상태 코드 를 되 돌려 달라 고 요청 하 는 것 을 볼 수 있 습 니 다.프로 토 콜 전환 이라는 뜻 입 니 다.

이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기