SPRING web socket
web socket : 양방향 통신 (채팅)

https://mvnrepository.com/ - spring websocket 검색 - 첫번째 클릭
- 아무버전 클릭 - maven 내용 복사 - pom.xml(${org.springframework-version}) 붙여넣기
https://mvnrepository.com/ - jackson databind 검색 - 첫번째 클릭
- 2.12.1 버전 클릭 - maven 내용 복사 - pom.xml 붙여넣기

socket 관련 class 생성(TestSocket.java)
기본 설정 : servlet-context.xml - Namespaces - websocket 체크
servlet-context.xml - Source -
<beans:bean id="ts" class="socket 관련 class(TestSocket) 경로" /> : 빈 생성
<websocket:handlers>
<websocket:mapping handler="ts" path="/chat" /> : /chat 을 요청하면 ts객체를 바로보게끔 설정
<websocket:sockjs /> : socket api를 사용할 수 있게 설정
</websocket:handlers>
* TestSocket.java - extends TextWebSocketHandler
TestSocket.java - Override/Implement Methods - AbstractWebSocketHandler
- after~closed, after~Established, handleTextMessage 체크 - ok


afterConnectionEstablished : 클라이언트가 연동되면 실행
handleTextMessage : 사용자가 메시지를 보내면 실행
afterConnectionClosed : 클라이언트가 종료 및 연결이 끊기면 실행


해당 test_socket.jsp 페이지에 접속시, 지정한 세션을 부여한다.
"상담사 연결" 버튼을 누르면, chat()함수로 이동한 후, socket이라는 경로의 페이지로 이동한다.
* controller에서 부여한 session과 TestSocket.java에서 받은 session은 타입이 다르다.
따라서, servlet-context.xml - Source -
<websocket:handshake-interceptors>
<beans:bean class="org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor" />
</websocket:handshake-interceptors>
을 추가한다.

session.getId() : WebSocketSession에서 부여한 session
session.getAttributes() : controller에서 부여한 session
List에는 session 전체를 넣고, Map에는 key에 session.getId(), value에는 session.getAttributes().get("name")

TextMessage message로 넘어온 값을 message.getPayload() = 입력한 내용 받아오기
sessionMap.get(session.getId()) : Map에 session.getId()를 통해 밸류가 얻어오기(ex. 홍길동1)
sessionList의 forEach문을 통해, .sendMessage(text)를 통해 문자 전달하기

연결이 끊겼을 때, 알려주는 역할

let sock = null : WebSocket 객체를 저장한 변수 sock 선언
let wsUri : "ws://localhost:8080/root/chat/websocket" : 연결이 설정될 WebSocket URI 지정
sock = new WebSocket(wsUri) : 지정된 uri로 새 WebSocket연결을 생성
sock.onmessage = onMessage : 들어오는 메시지를 처리하는 함수 onMessage를 설정
sock.onclose = onClose : 연결이 닫힐 때 처리하는 함수 onClose를 설정
$("#send_msg").keydown( (key) => {
if (key.keyCode == 13) {} }) : 엔터키를 눌렀을때 함수 실행
sock.send() : 추출한 메시지를 서버로 전송
.append() : 요소 끝에 계속 추가하는 역할

실행 결과
'sts_spring' 카테고리의 다른 글
SPRING 8일차 (0) | 2024.05.20 |
---|---|
SPRING 6일차 (email 전송 & 인증, scheduler, ajax, json방식, RestController, SPA) (0) | 2024.05.16 |
SPRING 5일차 (자동 로그인, 보안 처리 XSS, 파일 업로드 & 다운로드) (0) | 2024.05.14 |
SPRING 4일차 (암호화, api, Interceptor) (0) | 2024.05.13 |
SPRING 3일차 (cookie, session 및 database) (0) | 2024.05.09 |