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
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
thymeleaf로 HTML 페이지를 동적으로 만듭니다 (spring + gradle)지난번에는 에서 화면에 HTML을 표시했습니다. 이번에는 화면을 동적으로 움직여보고 싶기 때문에 입력한 문자를 화면에 표시시키고 싶습니다. 초보자의 비망록이므로 이상한 점 등 있으면 지적 받을 수 있으면 기쁩니다! ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.