[SPRING] HTML5 SOCKET 통신 [sample]

2017. 12. 11. 15:49·FrameWork/Spring
728x90
반응형

1. POM에서 dependency를 생성한다.

<!-- WebSocket -->
<dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-websocket</artifactId>
   <version>4.1.6.RELEASE</version>
</dependency>
<!-- jackson -->
<dependency>
   <groupId>com.fasterxml.jackson.core</groupId>
   <artifactId>jackson-databind</artifactId>
   <version>2.5.3</version>
   <scope>runtime</scope>
</dependency>

 

 

JS에서 sockjs-0.3.4.js를 추가한다.

sockjs-0.3.4.js
다운로드

Controller에서 보여질 페이지를 설정한 다음,

EchoHandler.java 를 생성하여

아래와 같은 소스를 추가한다.

package jungle.util;

import java.util.ArrayList;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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;

public class EchoHandler extends TextWebSocketHandler{

private static Logger logger = LoggerFactory.getLogger(EchoHandler.class);
 //세션을 모두 저장한다.
    //방법 1 :  1:1 채팅
//    private Map<String, WebSocketSession> sessions = new HashMap<String, WebSocketSession>();
    
    //방법 2 : 전체 채팅
    private List<WebSocketSession> sessionList = new ArrayList<WebSocketSession>();
    /**
     * 클라이언트 연결 이후에 실행되는 메소드
     */
    @Override
    public void afterConnectionEstablished(WebSocketSession session)
            throws Exception {
        sessionList.add(session);
        logger.info("{} 연결됨", session.getRemoteAddress());
    }

    /**
     * 클라이언트가 웹소켓서버로 메시지를 전송했을 때 실행되는 메소드
     */
    @Override
    protected void handleTextMessage(WebSocketSession session,
        TextMessage message) throws Exception {
        logger.info("{}로 부터 {} 받음", session.getRemoteAddress(), message.getPayload());
        for(WebSocketSession sess : sessionList){
            sess.sendMessage(new TextMessage(session.getRemoteAddress() +" : "+ message.getPayload()));
        }
    }

    /**
     * 클라이언트가 연결을 끊었을 때 실행되는 메소드
     */
    @Override
    public void afterConnectionClosed(WebSocketSession session,
            CloseStatus status) throws Exception {
        sessionList.remove(session);
        logger.info("{} 연결 끊김", session.getRemoteAddress());
    }
}
 
 

스프링 컨테이너에 가서, namespaces에 websocket을 체크해 준 뒤,

<bean id="echoHandler" class="jungle.util.EchoHandler"/>
    <websocket:handlers>
        <websocket:mapping handler="echoHandler" path="/echo" />
        <websocket:sockjs />
    </websocket:handlers>
</bean>
를 추가하고,
 

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>JSP</title>
<script type="text/javascript" src="<c:url value="https://code.jquery.com/jquery-3.1.1.min.js"/>"></script>
<script type="text/javascript" src="<c:url value="/js/sockjs-0.3.4.js"/>"></script>
<script type="text/javascript">
    $(document).ready(function() {
        $("#sendBtn").click(function() {
            sendMessage();
        });
    });
    var sock;
    //웸소켓을 지정한 url로 연결한다.
    sock = new SockJS("<c:url value="/echo"/>");
    //자바스크립트 안에 function을 집어넣을 수 있음.
    //데이터가 나한테 전달되읐을 때 자동으로 실행되는 function
    sock.onmessage = onMessage;
    //데이터를 끊고싶을때 실행하는 메소드
    sock.onclose = onClose;
    /* sock.onopen = function(){
        sock.send($("#message").val());
    }; */
    function sendMessage() {
        /*소켓으로 보내겠다.  */
        sock.send($("#message").val());
    }
    //evt 파라미터는 웹소켓을 보내준 데이터다.(자동으로 들어옴)
    function onMessage(evt) {
        var data = evt.data;
        $("#data").append(data + "<br/>");
        //sock.close();
    }
    function onClose(evt) {
        $("#data").append("연결 끊김");
    }
</script>
</head>
<body>
    <input type="text" id="message" />
    <input type="button" id="sendBtn" value="전송" />
    <div id="data"></div>
</body>
</html>
 

728x90
반응형

'FrameWork > Spring' 카테고리의 다른 글

[Spring] 스프링 @PathVariable 특수문자 포함  (0) 2018.07.23
[spring] taglib 활용  (0) 2018.04.24
[SPRING] AOP를 이용하여 어노테이션(annotation) 만들기(활용 / 사용법)  (0) 2017.12.04
[SPRING] 스프링과 마이바티스 에서 다중 데이타소스 사용하기  (0) 2017.10.19
[Spring, JAVA] 파일 복사(FileChannel 이용)  (0) 2017.09.21
'FrameWork/Spring' 카테고리의 다른 글
  • [Spring] 스프링 @PathVariable 특수문자 포함
  • [spring] taglib 활용
  • [SPRING] AOP를 이용하여 어노테이션(annotation) 만들기(활용 / 사용법)
  • [SPRING] 스프링과 마이바티스 에서 다중 데이타소스 사용하기
밍글링글링
밍글링글링
mingling - 밍글링, 밍글밍글링. 코드와 어우러지다. IT/ 프로그래밍/소스
    반응형
    250x250
  • 밍글링글링
    mingling
    밍글링글링
  • 전체
    오늘
    어제
    • 밍글링글링 (407) N
      • Flutter (2)
      • 일상생활 (8)
        • 리뷰 (1)
        • 생활정보 (4)
        • 맛집 (0)
        • 여행 (0)
        • 모든정보 (3)
      • JAVA (126)
        • 개념 (6)
        • 예제 (115)
        • Exception (2)
      • C (1)
        • C (1)
        • C++ (0)
        • C# (0)
      • JS (29)
        • JavaScript (18)
        • JQuery (5)
        • AJax (0)
        • NODE.JS (6)
        • Angular.JS 2.0 (0)
      • WEB (87)
        • HTML (6)
        • CSS (61)
        • JSP (20)
        • JSTL (0)
      • FrameWork (8)
        • Spring (8)
        • BootStrap (0)
        • MyBATIS (0)
        • JUnit (0)
      • 외부 라이브러리 (5)
      • 공유 소스 관리 (5)
        • Git (5)
        • SVN (0)
      • 빅데이터 프로그래밍 (37)
        • Python (37)
        • R Programming (0)
      • DB (7)
        • ORACLE (0)
        • MySql (6)
      • Development Tools (7)
        • StarUML (0)
        • eXERD (0)
        • Eclipse (4)
      • SKILL (6)
        • Migration (0)
        • Security (6)
      • MicroSoft (0)
        • Excel (0)
        • Word (0)
      • Android (0)
      • Server (21)
        • Ubuntu (5)
        • Linux (15)
      • IOS (0)
      • XML (0)
      • 미디어 (0)
      • 공지사항 (3)
      • NETWORK (1)
      • 게임 (4)
        • 피파 (1)
        • 리니지M (0)
        • 배틀그라운드 (1)
        • 듀랑고 (2)
      • 세상 이슈 (6)
      • 일렉트론 (0)
      • 대회 소식 (4)
      • 업무 (2)
      • Express, Vue (6)
      • docker (11)
      • svelte (3)
      • 블록체인 (1)
      • IT (10) N
      • Rust (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 미디어로그
    • 위치로그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    docker
    브라우저 자동화
    nginx ssl 설정
    css tb
    자바 배열
    Extension Bisect
    nginx ssl 적용
    lang rust
    티스토리 자동화
    proxy pass
    클론코딩
    vue cli
    servlet class
    css transition
    css block
    ubuntu
    자바 객체 지향
    VS Code 팁
    자바 생성자
    SSL 인증서
    mysql db
    Java Array
    css table
    오류
    css float
    rust linux
    Rust lang
    리눅스 설치
    jsp parameter
    프런트엔드
    에디터 팁
    AI 코딩 에이전트
    vscode
    자바 exception
    css list
    자바 클래스
    nginx
    java casting
    러스트
    spring java
    jsp include
    React Compiler
    Node
    자바 for문
    svelte
    css perspective
    vue 설치
    ssl 인증서 발급
    gitlab 설치
    API 설계
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
밍글링글링
[SPRING] HTML5 SOCKET 통신 [sample]
상단으로

티스토리툴바