'2012/01/26'에 해당되는 글 2건

  1. 2012.01.26 톰캣 (Tomcat) maven repository 정보
  2. 2012.01.26 조만간 톰캣 (Tomcat) web socket 지원? 2

 


1. 톰캣 7 (tomcat 7)

http://repo2.maven.org/maven2/org/apache/tomcat/tomcat-catalina/

  <groupId>org.apache.tomcat</groupId>
  <artifactId>tomcat-catalina</artifactId>

이미지#1) nexus 정보

image

 

 

톰캣 6 (tomcat 6)

http://repo2.maven.org/maven2/org/apache/tomcat/catalina/

  <groupId>org.apache.tomcat</groupId>
  <artifactId>catalina</artifactId>

이미지#2) nexus 정보

image

 

특이할 점은 tomcat 6에는 sources.jar가 없다. tomcat 7부터 sources.jar를 하도록 했기 때문이다. 이것때문에 tomcat 개발자들 사이에 미묘한 긴장감이 있었다. 결국은 sources.jar도 들어가도록 일부 내용이 수정되었다. (spring 프로젝트라면 당연할 것 같지만, apache 프로젝트는 좀 보수적이라 쉽지 않다. 어서 좋게 바뀌길 바랄 뿐~ 톰캣에 대한 기대를 앞으로 더욱 기대할 수 있을 것 같다. )

Posted by '김용환'
,

 

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 '김용환'
,