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. 클래스 구조
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); + } + } + } +} |