SPRING
2018.03.21 / 01:40

À¥ ¼ÒÄÏ(springÀ» ÀÌ¿ëÇÑ Ã¤ÆÃ)

ÈÞ°í
Ãßõ ¼ö 249

À¥ ¼ÒÄÏ

Http protocolÀ» ±â¹ÝÀ¸·Î ÇÏÁö¸¸, WS¶ó´Â protocolÀ» ¾´´Ù.

À¥ ºê¶ó¿ìÀú¿Í À¥ ¼­¹ö °£ÀÇ ¾ç¹æÇâ Åë½ÅÀ» Áö¿øÇϱâ À§ÇÑ Ç¥ÁØÀ̸ç,

Ŭ¶óÀ̾ðÆ®¿Í ¼­¹ö°¡ ¼­·Î ½Ç½Ã°£À¸·Î ¸Þ½ÃÁö¸¦ ÀÚÀ¯·Ó°Ô ÁÖ°í ¹ÞÀ» ¼ö ÀÖ´Ù.

Windows Application °°Àº ¾îÇø®ÄÉÀ̼ÇÀÇ °³¹ßÀÌ °¡´ÉÇϸç, ÁַΠäÆà ¼­ºñ½º¸¦ °³¹ßÇÑ´Ù.

 

JSR-356´Â ÀÚ¹ÙÀÇ À¥ ¼ÒÄÏ Ç¥ÁØÀÌÁö¸¸, ÀÌ°ÍÀ¸·Î ¼­¹ö ±â´ÉÀ» °³¹ßÇϱâ´Â ¸Å¿ì Èûµé¾î¼­ springÀÌ Áö¿øÀ» ÇØÁØ´Ù.

±×°Ô WebSockHandlerÀÌ´Ù. JSR-356ÀÇ ±¸Çöü·Î½á Spring¿¡¼­ Á¦°øµÇ°í ÀÖ´Â °´Ã¼ÀÌ´Ù. Servlet 3ÀÇ À¥ ¼ÒÄÏ ±â´É¿¡ ÀÇÁ¸ÀûÀ̱⠶§¹®¿¡ Servlet 3À» Áö¿øÇÏÁö ¾Ê´Â ÄÁÅ×À̳ʿ¡¼­´Â »ç¿ë ÇÒ ¼ö ¾ø´Ù.

 

äÆÃÀ» ÇÒ ¼ö ÀÖ´Â ÇÁ·Î±×·¥À¸·Î´Â nodejs°¡ ÀÖÀ¸³ª, »ç¿ëÇÏ·Á¸é ¼­¹ö°¡ µ¶¸³ÀûÀ̱⠶§¹®¿¡ ´À¸®¸ç, Sing ThreadÀ̱⠶§¹®¿¡ Á÷·ÄÁö¿øÀ» ÇϹǷΠ¿©·¯¸íÀÌ ÇѲ¨¹ø¿¡ ÀÌ¿ëÇÑ´Ù¸é ¹®Á¦°¡ ¹ß»ýÇÑ´Ù.

¹Ý¸é, À¥ ¼ÒÄÏÀº Á÷·ÄÁö¿øµµ ÇÏ¸ç ¶ÇÇÑ, º´·ÄÁö¿øÀ» ÇÑ´Ù.

 

ȱÆÃ2À¥ ¼ÒÄÏÀ» Áö¿øÇØÁÖ±â À§ÇÑ ¼³Á¤

MavenÀÇÁ¸ ¼³Á¤(poem.xml)

 

 

1
2
3
4
5
<dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-websocket</artifactId>
          <version>4.1.6.RELEASE</version>
      </dependency>
cs

 

 

 

EchoHandler.java

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
package com.ktds.mcjang.chat;
 
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
 
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);
    
    //¹æ¹ýÀÏ ÀÏ´ëÀÏêÆà map»ç¿ë
    Map<String, WebSocketSession> sessions  = new HasMap<String, WebSocketSession>();*/
    
    private List<WebSocketSession> sessionList = new ArrayList<WebSocketSession>();
    /**
     * Å¬¶óÀ̾ðÆ® ¿¬°á ÀÌÈÄ¿¡ ½ÇÇàµÇ´Â ¸Þ¼Òµå
     */
    @Override
    public void afterConnectionEstablished(WebSocketSession session)
            throws Exception {
        //Map»ç¿ë½Ã
        session.put(session.getId(), session);
        
        //List¾µ¶§
        sessionList.add(session);
        logger.info("{} ¿¬°áµÊ", session.getId());
    }
    /**
     * Å¬¶óÀ̾ðÆ®°¡ À¥¼ÒÄϼ­¹ö·Î ¸Þ½ÃÁö¸¦ Àü¼ÛÇßÀ» ¶§ ½ÇÇàµÇ´Â ¸Þ¼Òµå
     */
    @Override
    protected void handleTextMessage(WebSocketSession session,
        

        TextMessage message) throws Exception {

        logger.info("{}·Î ºÎÅÍ {} ¹ÞÀ½", session.getId(), message.getPayload());
        
        //¹è¿­À̸頸¹ÀÌ ¾µ¼ö ÀÖ°í, ¾²Áö¾ÊÀ¸¸é ÃÖ´ë 2°³ÀÓ¿©
        /*logger.info("{}¿Í ºÎÅÍ {}¹ÞÀ½",new String[] {session.getId(), message.getPayload()});*/
        
        //¿¬°áµÇ¾îÀִ ¸ðµç Å¬¶óÀ̾ðÆ®µé¿¡°Ô ¸Þ½ÃÁö¸¦ Àü¼ÛÇÑ´Ù

        //session.sendMessage(new TextMessage("echo:" + message.getPayload()));

 

        for(WebSocketSession sess : sessionList){
            sess.sendMessage(new TextMessage("echo: " +  message.getPayload()));
        }
        
        /*map»ç¿ë
        Interator<String> sessionIds = sessions.keySet().iterator();
        String sessionId="";
        while(sessionIds.hasNext()){s
            sessionId = sessionIds.next();
            sessions.get(sessionId).sendMessaget(new TextMessage("echo:" + message.getPayload()));
            
        }*/
        
    }
    /**
     * Å¬¶óÀ̾ðÆ®°¡ ¿¬°áÀ» ²÷¾úÀ» ¶§ ½ÇÇàµÇ´Â ¸Þ¼Òµå
     */
    @Override
    public void afterConnectionClosed(WebSocketSession session,
            CloseStatus status) throws Exception {
        //list
        sessionList.remove(session);
        //map
        //sessions.remove(session.getId());
        //logger.info("{} ¿¬°á ²÷±è", session.getId());
    }
    
    
}
 

cs

 

web.xml¿¡ Ãß°¡ÇÒ ºÎºÐ  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<servlet>
      <servlet-name>dispatcherServlet</servlet-name>
      <servlet-class>
          org.springframework.web.servlet.DispatcherServlet
      </servlet-class>
      <init-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>
              /WEB-INF/config/spring/dispatcherServlet.xml
              /WEB-INF/config/spring/ws-config.xml
          </param-value>
      </init-param>
      <load-on-startup>1</load-on-startup>
  </servlet>
cs

https://github.com/sockjs/sockjs-client

 

ÀúÀåÈÄ ¾ÐÃà Ǭ ´ÙÀ½¿¡

 

 

ÀÌÆÄÀÏÀ» ù¹ø° ÆÄÀÏ À§Ä¡¸¦ ºÁ¼­ ¿Å±è

1
<mvc:resources location="/WEB-INF/static/" mapping="/static/**"/> 
cs

ÀÌ°ÅÇß´ÂÁö È®ÀÎÇϱâ

chat.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<%@ 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 http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="<c:url value="/static/jquery/jquery-1.11.2.js"/>"></script>
<script type="text/javascript" src="<c:url value="/static/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>
cs

 



Ãâó: http://souning.tistory.com/13 [-]