ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • WebSocket을 이용한 채팅
    Spring 2021. 7. 2. 23:16

    기본설정

    1. pom.xml 에 dependency 추가

    2. EchoHandler class 생성

    package com.sp.ex;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.socket.CloseStatus;
    import org.springframework.web.socket.TextMessage;
    import org.springframework.web.socket.WebSocketSession;
    import org.springframework.web.socket.handler.TextWebSocketHandler;
    
    @RequestMapping("/echo")
    public class EchoHandler extends TextWebSocketHandler {
    
    	// 세션 리스트
    	private List<WebSocketSession> sessionList = new ArrayList<WebSocketSession>();
    
    	private static Logger logger = LoggerFactory.getLogger(EchoHandler.class);
    
    	// 클라이언트가 연결 되었을 때 실행
    	@Override
    	public void afterConnectionEstablished(WebSocketSession session) throws Exception {
    		sessionList.add(session);
    		logger.info("{} 연결됨", session.getId());
    	}
    
    	// 클라이언트가 웹소켓 서버로 메시지를 전송했을 때 실행
    	@Override
    	protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
    		System.out.println("하이");
    		System.out.println(message.getPayload());
    		
    		logger.info("{}로 부터 {} 받음", session.getId(), message.getPayload());
    		// 모든 유저에게 메세지 출력
    		for (WebSocketSession sess : sessionList) {
    			sess.sendMessage(new TextMessage(message.getPayload()));
    		}
    	}
    
    	// 클라이언트 연결을 끊었을 때 실행
    	@Override
    	public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
    		sessionList.remove(session);
    		logger.info("{} 연결 끊김.", session.getId());
    	}
    
    }
    

     

    3. Chat.jsp 추가

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    <script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.js"></script>
    <script type="text/javascript"
    	src="https://cdnjs.cloudflare.com/ajax/libs/sockjs-client/1.1.5/sockjs.min.js"></script>
    </head>
    <body>
    	<input type="text" id="message" />
    	<input type="button" id="sendBtn" value="submit"/>
    	<div id="messageArea"></div>
    </body>
    <script type="text/javascript">
    	$("#sendBtn").click(function() {
    		sendMessage();
    		$('#message').val('')
    	});
    
    	let sock = new SockJS("http://localhost:8787/ex/echo/");
    	sock.onmessage = onMessage;
    	sock.onclose = onClose;
    	// 메시지 전송
    	function sendMessage() {
    		sock.send($("#message").val());
    	}
    	// 서버로부터 메시지를 받았을 때
    	function onMessage(msg) {
    		var data = msg.data;
    		$("#messageArea").append(data + "<br/>");
    	}
    	// 서버와 연결을 끊었을 때
    	function onClose(evt) {
    		$("#messageArea").append("연결 끊김");
    
    	}
    </script>
    </html>
Designed by Tistory.