Jetty는 Websocket를 지원하고 있는데, 톰캣은 지원하지 않고 있다. 그러나 톰캣도 조만간에 web socket을 지원할 것 같다. 아직 공지를 하지 않았지만, 리더인 Mark Tomas는 이메일을 통해서 속도보다는 기능 측면에서 구현한 코드를 내어놓았다. 구조를 크게 바꾸지 않은 상태로 진행하려는 Mark Tomas의 노력이 있어보인다. 

http://people.apache.org/~markt/patches/draft/2012-01-24-websocket.patch

코드를 완벽히 구현한 것은 아니고 간단하게 틀만 제공한 것으로서 톰캣 내부 개발자들이 잘 만들리라 생각된다. (참고로. 톰캣과 아파치 쪽은 상당히 보수적으로 운영되고 있어서 왠만하면 잘 구현 안해준다. 커미터들도 상당히 제한된 사람들로 이루어진 부분이 있다. 개인적으로 친해진다면 잘 구현해줄지도.. )

 

소스 내용을 잠깐 소개하면 다음과 같다. (내용은 언제든지 바뀔 수 있을 것이다.)

1. org.apache.catalina.websocket 패키지를 추가

2. 소켓에 Upgrade 개념을 추가함

SocketState 에 Upgrade를 추가

public abstract class AbstractEndpoint {

         public enum SocketState {
             // TODO Add a new state to the AsyncStateMachine and remove
             //      ASYNC_END (if possible)
-            OPEN, CLOSED, LONG, ASYNC_END, SENDFILE
+            OPEN, CLOSED, LONG, ASYNC_END, SENDFILE, UPGRADE
         }

 

3. 클래스 구조

image

 

 

image

 

image

 

image

 

4. 예제

클라이언트

+<script type="text/javascript">
+function echo() {
+  if ("WebSocket" in window) {
+    alert("WebSocket is supported by this browser.");
+
+    // TODO: Can we use relative URLs?
+    var ws = new WebSocket("ws://localhost:8080/examples/websocket/echo");
+    ws.onopen = function() {
+      ws.send("Connection opened");
+      alert("WebSocket connection opened.");
+    }
+    ws.onmessage = function(event) {
+      alert("Received: " + event.data);
+    }
+    ws.onclose = function() {
+      alert("WebSocket connection closed.");
+    }
+    // TODO: Extend with a text box for users to enter data
+  } else {
+    alert("WebSocket is not supported by this browser.");
+  }
+}
+</script>

 

자바 서블릿 코드

+public class Echo extends WebSocketServlet {
+
+    private static final long serialVersionUID = 1L;
+
+    @Override
+    protected StreamListener createWebSocketConnection() {
+        return new EchoListener();
+    }
+
+    private static final class EchoListener extends StreamListener {
+
+        @Override
+        protected void onBinaryData(InputStream is) throws IOException {
+            // Simply echo the data to stdout
+            int i = is.read();
+            while (i != -1) {
+                System.out.write(i);
+                i = is.read();
+            }
+        }
+
+        @Override
+        protected void onTextData(Reader r) throws IOException {
+            char[] c = new char[1];
+            int i = r.read(c);
+            while (i != -1) {
+                System.out.println(c);
+                i = r.read(c);
+            }
+        }
+    }
+}

Posted by '김용환'
,