À¥ ¼ÒÄÏ(springÀ» ÀÌ¿ëÇÑ Ã¤ÆÃ)
À¥ ¼ÒÄÏ
Http protocolÀ» ±â¹ÝÀ¸·Î ÇÏÁö¸¸, WS¶ó´Â protocolÀ» ¾´´Ù.
À¥ ºê¶ó¿ìÀú¿Í À¥ ¼¹ö °£ÀÇ ¾ç¹æÇâ Åë½ÅÀ» Áö¿øÇϱâ À§ÇÑ Ç¥ÁØÀ̸ç,
Ŭ¶óÀ̾ðÆ®¿Í ¼¹ö°¡ ¼·Î ½Ç½Ã°£À¸·Î ¸Þ½ÃÁö¸¦ ÀÚÀ¯·Ó°Ô ÁÖ°í ¹ÞÀ» ¼ö ÀÖ´Ù.
Windows Application °°Àº ¾îÇø®ÄÉÀ̼ÇÀÇ °³¹ßÀÌ °¡´ÉÇϸç, ÁַΠäÆà ¼ºñ½º¸¦ °³¹ßÇÑ´Ù.
JSR-356´Â ÀÚ¹ÙÀÇ À¥ ¼ÒÄÏ Ç¥ÁØÀÌÁö¸¸, ÀÌ°ÍÀ¸·Î ¼¹ö ±â´ÉÀ» °³¹ßÇϱâ´Â ¸Å¿ì Èûµé¾î¼ springÀÌ Áö¿øÀ» ÇØÁØ´Ù.
±×°Ô WebSockHandlerÀÌ´Ù. JSR-356ÀÇ ±¸Çöü·Î½á Spring¿¡¼ Á¦°øµÇ°í ÀÖ´Â °´Ã¼ÀÌ´Ù. Servlet 3ÀÇ À¥ ¼ÒÄÏ ±â´É¿¡ ÀÇÁ¸ÀûÀ̱⠶§¹®¿¡ Servlet 3À» Áö¿øÇÏÁö ¾Ê´Â ÄÁÅ×À̳ʿ¡¼´Â »ç¿ë ÇÒ ¼ö ¾ø´Ù.
äÆÃÀ» ÇÒ ¼ö ÀÖ´Â ÇÁ·Î±×·¥À¸·Î´Â nodejs°¡ ÀÖÀ¸³ª, »ç¿ëÇÏ·Á¸é ¼¹ö°¡ µ¶¸³ÀûÀ̱⠶§¹®¿¡ ´À¸®¸ç, Sing ThreadÀ̱⠶§¹®¿¡ Á÷·ÄÁö¿øÀ» ÇϹǷΠ¿©·¯¸íÀÌ ÇѲ¨¹ø¿¡ ÀÌ¿ëÇÑ´Ù¸é ¹®Á¦°¡ ¹ß»ýÇÑ´Ù.
¹Ý¸é, À¥ ¼ÒÄÏÀº Á÷·ÄÁö¿øµµ ÇÏ¸ç ¶ÇÇÑ, º´·ÄÁö¿øÀ» ÇÑ´Ù.
À¥ ¼ÒÄÏÀ» Áö¿øÇØÁÖ±â À§ÇÑ ¼³Á¤
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()); } } |
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 [-]