94
Realtime Web Application with Java Arawn & Outsider in 봄싹 2011.6.19 2011년 6월 21일 화요일

Realtime web application with java

Embed Size (px)

DESCRIPTION

JCO 2011에서 발표한 슬라이드

Citation preview

Realtime����������� ������������������  WebApplicationwith����������� ������������������  Java

Arawn����������� ������������������  &����������� ������������������  Outsider����������� ������������������  in����������� ������������������  봄싹2011.6.19

2011년 6월 21일 화요일

RealTimeWeb2011년 6월 21일 화요일

Server����������� ������������������  Push

2011년 6월 21일 화요일

2011년 6월 21일 화요일

2011년 6월 21일 화요일

리얼타임����������� ������������������  웹에����������� ������������������  대해서����������� ������������������  얼마나����������� ������������������  알고����������� ������������������  계십니까?

2011년 6월 21일 화요일

http://springsprout.org:10000/

2011년 6월 21일 화요일

Client-sideServer-side

2011년 6월 21일 화요일

일단....

Client-side

2011년 6월 21일 화요일

현재(어쩌면����������� ������������������  약간����������� ������������������  과거)

2011년 6월 21일 화요일

Polling2011년 6월 21일 화요일

브라우저 서버2011년 6월 21일 화요일

브라우저 서버

요청

2011년 6월 21일 화요일

브라우저 서버

요청

응답

2011년 6월 21일 화요일

브라우저 서버

요청

응답

이벤트

2011년 6월 21일 화요일

브라우저 서버

요청

응답

이벤트주기

2011년 6월 21일 화요일

브라우저 서버

요청

응답

요청

이벤트주기

2011년 6월 21일 화요일

브라우저 서버

요청

응답

요청

응답

이벤트주기

2011년 6월 21일 화요일

사실...

서버푸시라고하기는����������� ������������������  어렵습니다.

2011년 6월 21일 화요일

&Comet

WebSocket2011년 6월 21일 화요일

Comet2011년 6월 21일 화요일

Ajax����������� ������������������  처럼����������� ������������������  특정기술이����������� ������������������  아닌����������� ������������������  ����������� ������������������  ����������� ������������������  패턴

2011년 6월 21일 화요일

Long����������� ������������������  Lived

HTTP����������� ������������������  Connection

2011년 6월 21일 화요일

Long����������� ������������������  Polling

2011년 6월 21일 화요일

브라우저 서버2011년 6월 21일 화요일

브라우저 서버

요청

2011년 6월 21일 화요일

브라우저 서버

요청

대기

2011년 6월 21일 화요일

브라우저 서버

요청

이벤트

대기

2011년 6월 21일 화요일

브라우저 서버

요청

응답

이벤트

대기

2011년 6월 21일 화요일

브라우저 서버

요청

요청

응답

이벤트

대기

2011년 6월 21일 화요일

JSONP����������� ������������������  Polling

2011년 6월 21일 화요일

JSONP����������� ������������������  ==JSON����������� ������������������  with����������� ������������������  padding

2011년 6월 21일 화요일

process({����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  “key”:����������� ������������������  “value”,����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  “key2”:����������� ������������������  “value2”});

<script����������� ������������������  src=”http://domain.com/?callback=process”>

</script>

스크립트����������� ������������������  태그로����������� ������������������  호출

서버에서����������� ������������������  콜백함수로����������� ������������������  JSON객체����������� ������������������  리턴

2011년 6월 21일 화요일

동일출처정책Same����������� ������������������  Origin����������� ������������������  Policy

2011년 6월 21일 화요일

도메인당커넥션����������� ������������������  2개����������� ������������������  제한

2011년 6월 21일 화요일

Streaming

2011년 6월 21일 화요일

브라우저 서버2011년 6월 21일 화요일

브라우저 서버

요청

2011년 6월 21일 화요일

브라우저 서버

요청

대기

2011년 6월 21일 화요일

브라우저 서버

요청

이벤트

대기

2011년 6월 21일 화요일

브라우저 서버

요청

응답����������� ������������������  (Chunked)

이벤트

대기

2011년 6월 21일 화요일

브라우저 서버

요청

응답����������� ������������������  (Chunked)

이벤트

이벤트

대기

2011년 6월 21일 화요일

브라우저 서버

요청

응답����������� ������������������  (Chunked)

이벤트

응답����������� ������������������  (Chunked) 이벤트

대기

2011년 6월 21일 화요일

var����������� ������������������  xhr����������� ������������������  =����������� ������������������  ����������� ������������������  new����������� ������������������  XMLHttpRequest();xhr.oepn('GET',����������� ������������������  '/comet',����������� ������������������  true);

xhr.onreadystatechange����������� ������������������  =����������� ������������������  function()����������� ������������������  {����������� ������������������  ����������� ������������������  ����������� ������������������  if����������� ������������������  (xhr.readyState����������� ������������������  ==����������� ������������������  3����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  &&����������� ������������������  xhr.status����������� ������������������  ==����������� ������������������  200)����������� ������������������  {����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  //����������� ������������������  xhr.responseText����������� ������������������  ����������� ������������������  ����������� ������������������  }}

2011년 6월 21일 화요일

Chunked???

2011년 6월 21일 화요일

IE는지원하지않습니다

2011년 6월 21일 화요일

Forever����������� ������������������  iframe(Hidden����������� ������������������  iframe)

2011년 6월 21일 화요일

웹페이지

서버2011년 6월 21일 화요일

웹페이지

hidden����������� ������������������  iframe

서버2011년 6월 21일 화요일

웹페이지

hidden����������� ������������������  iframe

서버

요청

2011년 6월 21일 화요일

웹페이지

hidden����������� ������������������  iframe

서버

Chunked����������� ������������������  Data

요청

2011년 6월 21일 화요일

웹페이지

hidden����������� ������������������  iframe

서버

Chunked����������� ������������������  Data

<script>데이터</script>

요청

2011년 6월 21일 화요일

클릭����������� ������������������  소리로딩바����������� ������������������  문제

2011년 6월 21일 화요일

ActiveXObject(“htmlfile”)

2011년 6월 21일 화요일

WebSocket

2011년 6월 21일 화요일

HTML5W3C/IETF����������� ������������������  표준WebSocket����������� ������������������  프로토콜����������� ������������������  사용

진정한����������� ������������������  양방향����������� ������������������  통신2011년 6월 21일 화요일

HTTP를업그래이드해서웹소켓프로토콜을����������� ������������������  

연결한다2011년 6월 21일 화요일

HTTP����������� ������������������  호환����������� ������������������  handshake

80/443으로����������� ������������������  동작Proxy/firewall에����������� ������������������  친화적

ws://와����������� ������������������  wss://����������� ������������������  사용

2011년 6월 21일 화요일

//����������� ������������������  요청GET����������� ������������������  /demo����������� ������������������  HTTP/1.1Upgrade:����������� ������������������  WebSocketConnection:����������� ������������������  UpgradeHost:����������� ������������������  example.comOrigin:����������� ������������������  http://example.comWebsocket-Protocol:����������� ������������������  sample

//����������� ������������������  응답HTTP/1.1����������� ������������������  101����������� ������������������  Web����������� ������������������  Socket����������� ������������������  Protocol����������� ������������������  HandshakeUpgrade:����������� ������������������  WebsocketConnection:����������� ������������������  UpgradeWebsocket-Origin:����������� ������������������  http://example.comWebSocket-Location:����������� ������������������  ws://example.com/demoWebSocket-Protocol:����������� ������������������  sample

2011년 6월 21일 화요일

var����������� ������������������  ws����������� ������������������  =����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  new����������� ������������������  WebSocket("ws://domain.com");

ws.onOpen����������� ������������������  =����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  function(e)����������� ������������������  {����������� ������������������  console.log("opened");����������� ������������������  }ws.onRead����������� ������������������  =����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  function(e)����������� ������������������  {����������� ������������������  console.log(e.data);����������� ������������������  }ws.onClose����������� ������������������  =����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  function(e)����������� ������������������  {����������� ������������������  console.log("closed");����������� ������������������  }

ws.send("Hello����������� ������������������  World");

2011년 6월 21일 화요일

Adobe����������� ������������������  

FlashSocket

2011년 6월 21일 화요일

Server-side

2011년 6월 21일 화요일

지속적인����������� ������������������  연결!(persistent����������� ������������������  connection)

2011년 6월 21일 화요일

Threadper

Request2011년 6월 21일 화요일

Thread����������� ������������������  per����������� ������������������  Request

Servlet����������� ������������������  Pool

....

Servlet����������� ������������������  Container

Thread

Servlet

Servlet

Servlet

Servlet

Request

Request

Request

RequestThread

Thread

Thread

2011년 6월 21일 화요일

ServletContainer

Comet����������� ������������������  지원2011년 6월 21일 화요일

Resin(3.1����������� ������������������  +)

2011년 6월 21일 화요일

CometServletpublic����������� ������������������  interface����������� ������������������  CometServlet����������� ������������������  extends����������� ������������������  Servlet����������� ������������������  {

����������� ������������������  ����������� ������������������  boolean����������� ������������������  service(ServletRequest,����������� ������������������  ServletResponse,����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  CometController)����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  throws����������� ������������������  ServletException,����������� ������������������  IOException;����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  

����������� ������������������  ����������� ������������������  boolean����������� ������������������  resume(ServletRequest,����������� ������������������  ServletResponse,����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  CometController)����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  throws����������� ������������������  ServletException,����������� ������������������  IOException;����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  }

2011년 6월 21일 화요일

Resin����������� ������������������  CometSample����������� ������������������  Code

2011년 6월 21일 화요일

Resin����������� ������������������  CometServlet����������� ������������������  처리����������� ������������������  흐름

service(cometCtrl)

Client CometServlet JobExecutor

execute(cometCtrl)

cometCtrl.wake()

resume(cometCtrl)

suspend

resume

2011년 6월 21일 화요일

Jetty(3.0����������� ������������������  +)

2011년 6월 21일 화요일

Continuationpublic����������� ������������������  interface����������� ������������������  Continuation����������� ������������������  {

����������� ������������������   public����������� ������������������  boolean����������� ������������������  suspend(long����������� ������������������  timeout);

����������� ������������������   public����������� ������������������  void����������� ������������������  resume();

����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ...

}

2011년 6월 21일 화요일

Tomcat(6.0����������� ������������������  +)

2011년 6월 21일 화요일

CometProcessorpublic����������� ������������������  interface����������� ������������������  CometProcessor����������� ������������������  ����������� ������������������  ����������� ������������������  extends����������� ������������������  Servlet����������� ������������������  {

����������� ������������������  ����������� ������������������  public����������� ������������������  void����������� ������������������  event(CometEvent)����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  throws����������� ������������������  IOException,����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ServletException;

}

2011년 6월 21일 화요일

Servlet����������� ������������������  3.0(����������� ������������������  JSR����������� ������������������  315����������� ������������������  )

2011년 6월 21일 화요일

<servlet>����������� ������������������  ����������� ������������������  <servlet-name>AsyncMessageListenServlet</servlet-name>����������� ������������������  ����������� ������������������  <servlet-class>...</servlet-class>

����������� ������������������  ����������� ������������������  <async-supported>����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  true����������� ������������������  ����������� ������������������  </async-supported>

</servlet><servlet-mapping>����������� ������������������  ����������� ������������������  <servlet-name>AsyncMessageListenServlet</servlet-name>����������� ������������������  ����������� ������������������  <url-pattern>/messageListen</url-pattern></servlet-mapping>

2011년 6월 21일 화요일

interface����������� ������������������  HttpServletRequest����������� ������������������  ����������� ������������������  ����������� ������������������  extends����������� ������������������  ServletRequest����������� ������������������  {

����������� ������������������  ����������� ������������������  AsyncContext����������� ������������������  startAsync();

����������� ������������������  ����������� ������������������  AsyncContext����������� ������������������  startAsync(����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ServletRequest,����������� ������������������  ServletResponse);

}

2011년 6월 21일 화요일

public����������� ������������������  interface����������� ������������������  AsyncContext����������� ������������������  {

����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  public����������� ������������������  ServletRequest����������� ������������������  getRequest();

����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  public����������� ������������������  ServletResponse����������� ������������������  getResponse();

}

2011년 6월 21일 화요일

Servlet����������� ������������������  3.0Sample����������� ������������������  Code

2011년 6월 21일 화요일

Asynchronous����������� ������������������  Servlet����������� ������������������  처리����������� ������������������  흐름

request.startAsync()

Client AsyncServlet JobExecutor

execute(asyncContext)

asyncContext.complete()

2011년 6월 21일 화요일

WebSocketServer

2011년 6월 21일 화요일

-����������� ������������������  jWebSocket����������� ������������������  ����������� ������������������  ����������� ������������������  (����������� ������������������  http://jwebsocket.org/����������� ������������������  )

-����������� ������������������  Netty����������� ������������������  ����������� ������������������  ����������� ������������������  (����������� ������������������  http://www.jboss.org/netty����������� ������������������  )

-����������� ������������������  Grizzly����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  (����������� ������������������  http://grizzly.java.net/����������� ������������������  )

2011년 6월 21일 화요일

추상화2011년 6월 21일 화요일

Web����������� ������������������  BrowserInternet����������� ������������������  Explorer����������� ������������������  /����������� ������������������  FireFox����������� ������������������  /����������� ������������������  Chrome����������� ������������������  /����������� ������������������  Safari����������� ������������������  ...

Comet����������� ������������������  ClientLong����������� ������������������  Polling����������� ������������������  /����������� ������������������  Streaming(XMLHttpRequest,����������� ������������������  forever����������� ������������������  iframe)����������� ������������������  /����������� ������������������  WebSocket

Comet����������� ������������������  Server

Client����������� ������������������  side

Server����������� ������������������  side

2011년 6월 21일 화요일

CometLibrary

2011년 6월 21일 화요일

Lightstreamer

scalable����������� ������������������  and����������� ������������������  reliable����������� ������������������  Server����������� ������������������  for����������� ������������������  

pushing����������� ������������������  live����������� ������������������  data����������� ������������������  to����������� ������������������  Rich����������� ������������������  

Internet����������� ������������������  Applications

2011년 6월 21일 화요일

Socket.IO

J2EE����������� ������������������  Servlet����������� ������������������  based����������� ������������������  Socket.IO����������� ������������������  

server����������� ������������������  implementation.

2011년 6월 21일 화요일

Project����������� ������������������  Atmosphere

a����������� ������������������  portable����������� ������������������  AjaxPush/Comet����������� ������������������  

and����������� ������������������  WebSocket����������� ������������������  Framework

2011년 6월 21일 화요일

Streamhub

HTTP����������� ������������������  Comet����������� ������������������  and����������� ������������������  

Reverse����������� ������������������  Ajax����������� ������������������  server

2011년 6월 21일 화요일

ServerPush

Long����������� ������������������  polling

Hidden����������� ������������������  iframe

WebSocket

Flash����������� ������������������  Socket

Lightstreamer

Socket.IO

Atmosphere

Streamhub

O O O O O

O O X O O

O O O O X

O O O O O

2011년 6월 21일 화요일

Streamhub-

QX����������� ������������������  QuizCode����������� ������������������  Review

https://github.com/spring-sprout

/jco-2011-realtime

2011년 6월 21일 화요일

Threadvs

Evented2011년 6월 21일 화요일

Questions...?Arawn

����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  [email protected]

����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  http://arawn.tistory.com

Outsider

����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  [email protected]

����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  http://blog.outsider.ne.kr2011년 6월 21일 화요일

끝2011년 6월 21일 화요일