자바 웹 소켓 의 실현 및 Spring 웹 소켓 에 대한 상세 한 설명
먼저 기초 정 보 를 알 고 있다.
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 상태 코드 를 되 돌려 달라 고 요청 하 는 것 을 볼 수 있 습 니 다.프로 토 콜 전환 이라는 뜻 입 니 다.이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.