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() : 요소 끝에 계속 추가하는 역할

 

실행 결과

 

+ Recent posts