티스토리 뷰

[Web]

Jetty 서버에서 WebSocket 이용하기

별을쫓다 2012. 6. 27. 01:58

먼저 Eclipse에서 Dynamic Web Service 프로젝트를 생성합니다.

프로젝트 생성하기


아래의 그림같이 java 파일과 html 파일을 생성합니다.


 

TailorWebSocketServlet.java

   1: package de.devsurf.html.tail;
   2:  
   3: import java.io.IOException;
   4: import java.util.Date;
   5: import java.util.Set;
   6: import java.util.concurrent.CopyOnWriteArraySet;
   7: import java.util.concurrent.Executors;
   8: import java.util.concurrent.ScheduledExecutorService;
   9: import java.util.concurrent.TimeUnit;
  10:  
  11: import javax.servlet.ServletException;
  12: import javax.servlet.http.HttpServletRequest;
  13: import javax.servlet.http.HttpServletResponse;
  14:  
  15: import org.eclipse.jetty.websocket.WebSocket;
  16: import org.eclipse.jetty.websocket.WebSocketServlet;
  17:  
  18: public class TailorWebSocketServlet extends WebSocketServlet {
  19:     private static final long serialVersionUID = -7289719281366784056L;
  20:     public static String newLine = System.getProperty("line.separator");
  21:     
  22:     private final Set<TailorSocket> _members = new CopyOnWriteArraySet<TailorSocket>();
  23:     private ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
  24:     
  25:     @Override
  26:     public void init() throws ServletException {
  27:         super.init();
  28:         executor.scheduleAtFixedRate(new Runnable() {
  29:             @Override
  30:             public void run() {
  31:                 System.out.println("Running Server Message Sending");
  32:                 for(TailorSocket member : _members){
  33:                     System.out.println("Trying to send to Member!");
  34:                     if(member.isOpen()){
  35:                         System.out.println("Sending!");
  36:                         try {
  37:                             member.sendMessage("Sending a Message to you Guys! "+new Date()+newLine);
  38:                         } catch (IOException e) {
  39:                             e.printStackTrace();
  40:                         }
  41:                     }
  42:                 }
  43:             }
  44:         }, 2, 2, TimeUnit.SECONDS);
  45:         
  46:     }
  47:  
  48:     protected void doGet(HttpServletRequest request,
  49:             HttpServletResponse response) throws ServletException, IOException {
  50:         getServletContext().getNamedDispatcher("default").forward(request,
  51:                 response);
  52:     }
  53:  
  54:     public WebSocket doWebSocketConnect(HttpServletRequest request,
  55:             String protocol) {
  56:         return new TailorSocket();
  57:     }
  58:  
  59:     class TailorSocket implements WebSocket.OnTextMessage {
  60:         private Connection _connection;
  61:         
  62:         @Override
  63:         public void onClose(int closeCode, String message) {
  64:             _members.remove(this);
  65:         }
  66:         
  67:         public void sendMessage(String data) throws IOException {
  68:             _connection.sendMessage(data);
  69:         }
  70:         
  71:         @Override
  72:         public void onMessage(String data) {
  73:             System.out.println("Received: "+data);
  74:         }
  75:         
  76:         public boolean isOpen() {
  77:             return _connection.isOpen();
  78:         }
  79:  
  80:         @Override
  81:         public void onOpen(Connection connection) {
  82:             _members.add(this);
  83:             _connection = connection;
  84:             try {
  85:                 connection.sendMessage("Server received Web Socket upgrade and added it to Receiver List.");
  86:             } catch (IOException e) {
  87:                 e.printStackTrace();
  88:             }
  89:         }
  90:     }
  91: }

test.html

   1: <html>
   2:     <head>
   3:         <title>Tail-based by Web Sockets</title>
   4:         <script type='text/javascript'>
   1:  
   2:             if (!window.WebSocket)
   3:                 alert("WebSocket not supported by this browser");
   4:         
   5:             function $() {
   6:                 return document.getElementById(arguments[0]);
   7:             }
   8:             function $F() {
   9:                 return document.getElementById(arguments[0]).value;
  10:             }
  11:         
  12:             function getKeyCode(ev) {
  13:                 if (window.event)
  14:                     return window.event.keyCode;
  15:                 return ev.keyCode;
  16:             }
  17:         
  18:             var server = {
  19:                 connect : function() {
  20:                     var location = document.location.toString().replace('http://',
  21:                             'ws://').replace('https://', 'wss://').replace('test.html','servlet/WebSocket');
  22:                             alert(location);
  23:                     this._ws = new WebSocket(location);
  24:                     this._ws.onopen = this._onopen;
  25:                     this._ws.onmessage = this._onmessage;
  26:                     this._ws.onclose = this._onclose;
  27:                 },
  28:         
  29:                 _onopen : function() {
  30:                     server._send('websockets are open for communications!');
  31:                 },
  32:         
  33:                 _send : function(message) {
  34:                     if (this._ws)
  35:                         this._ws.send(message);
  36:                 },
  37:         
  38:                 send : function(text) {
  39:                     if (text != null && text.length > 0)
  40:                         server._send(text);
  41:                 },
  42:         
  43:                 _onmessage : function(m) {
  44:                     if (m.data) {
  45:                         var messageBox = $('messageBox');
  46:                         var spanText = document.createElement('span');
  47:                         spanText.className = 'text';
  48:                         spanText.innerHTML = m.data;
  49:                         var lineBreak = document.createElement('br');
  50:                         messageBox.appendChild(spanText);
  51:                         messageBox.appendChild(lineBreak);
  52:                         messageBox.scrollTop = messageBox.scrollHeight
  53:                                 - messageBox.clientHeight;
  54:                     }
  55:                 },
  56:         
  57:                 _onclose : function(m) {
  58:                     this._ws = null;
  59:                 }
  60:             };
  61:         
</script>
   1:  
   2:         <style type='text/css'>
   3:             div {
   4:                 border: 0px solid black;
   5:             }
   6:             
   7:             div#messageBox {
   8:                 clear: both;
   9:                 width: 40em;
  10:                 height: 20ex;
  11:                 overflow: auto;
  12:                 background-color: #f0f0f0;
  13:                 padding: 4px;
  14:                 border: 1px solid black;
  15:             }
  16:             
  17:             div#input {
  18:                 clear: both;
  19:                 width: 40em;
  20:                 padding: 4px;
  21:                 background-color: #e0e0e0;
  22:                 border: 1px solid black;
  23:                 border-top: 0px
  24:             }
  25:             
  26:             div.hidden {
  27:                 display: none;
  28:             }
  29:             
  30:             span.alert {
  31:                 font-style: italic;
  32:             }
  33:         </style>
  34:     </head>
  35:     <body>
  36:         <div id='messageBox'></div>
  37:         <div id='input'>
  38:             <div>
  39:                 <input id='connect' class='button' type='submit' name='Connect'
  40:                     value='Connect' />
  41:             </div>
  42:         </div>
  43:         <script type='text/javascript'>
  44:             $('connect').onclick = function(event) {
  45:                 server.connect();
  46:                 return false;
  47:             };
  48:         
</script>
   5:  
   6:         <p>
   7:             This is a demonstration of the Jetty websocket server.
   8:         </p>
   9:     </body>
  10: </html>

 

WebContent/WEB-INF/web.xml 을 생성하고 아래와 같이 입력합니다.

   1: <?xml version="1.0" encoding="UTF-8"?>
   2: <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
   3:     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   4:     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
   5:     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
   6:     <display-name>tailor</display-name>
   7:     <servlet>
   8:         <servlet-name>WebSocket</servlet-name>
   9:         <servlet-class>de.devsurf.html.tail.TailorWebSocketServlet</servlet-class>
  10:     </servlet>
  11:     <servlet-mapping>
  12:         <servlet-name>WebSocket</servlet-name>
  13:         <url-pattern>/servlet/*</url-pattern>
  14:     </servlet-mapping>
  15:  
  16:     <welcome-file-list>
  17:         <welcome-file>test.html</welcome-file>
  18:     </welcome-file-list>
  19: </web-app>

 

WebContent/WEB-INF/lib 에 아래 두 라이브러리를 추가해줍시다.

jetty-util-8.1.3.v20120416.jar

jetty-websocket-8.1.3.v20120416.jar

위 두 파일은 제티를 다운 받으면 lib 폴더에 있습니다.

 

실행 결과


'[Web]' 카테고리의 다른 글

Jetty, JSP, Eclipse 연동  (0) 2012.04.08
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/04   »
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
글 보관함