웹 서버에서 브라우저로 데이터를 푸시하는 방법이 있습니까?


134

물론 Ajax를 알고 있지만 Ajax의 문제점은 브라우저가 서버를 자주 폴링하여 새 데이터가 있는지 확인해야한다는 것입니다. 서버로드가 증가합니다.

서버를 자주 폴링하는 것보다 더 나은 방법 (Ajax를 사용하는 것)이 있습니까?


1
확실하지 않습니다. 응용 프로그램을 개념적으로 간단하게 만들기 위해 폴링 요청 위에 전송 계층을 구현하여 응용 프로그램 논리에서 폴링 책임을 제거 할 수 있다고 생각합니다. 누군가가 이미 이것을 구현했을 수도 있습니까? <strong> 수정 : </ strong> 분명히 <a href=" en.wikipedia.org/wiki/Reverse_Ajax"> 역 Ajax </a> 및 <a href = " en.wikipedia.org/wiki/Comet_ ( programming) "> 경쟁 </ a >하지만 지금까지 직접 구현해야합니다. 이것에 대한 JavaScript 라이브러리?
Anders Sandvig

1
@Rachel-라이브 업데이트로 다른 사람들의 활동을 볼 수 있습니다. StackOverflow와 같은 사이트 및 Google 문서와 같은 공동 작업을위한 웹 응용 프로그램에 적합합니다.
Itai Bar-Haim

1
2016 년에 이런 종류의 일을하는 사람이라면 아마도 이런 종류의 커뮤니케이션에 웹 소켓이 더 나은 선택이 될 것입니다.
Shadow

답변:



37

예, 이름을 Reverse Ajax 또는 Comet 이라고 합니다. Comet은 기본적으로 웹 브라우저에 실시간으로 데이터를 푸시하기 위해 오래 지속되는 HTTP 요청을 여는 다양한 방법에 대한 포괄적 인 용어입니다. StreamHub Push Server를 추천 하고 멋진 데모가 있으며 다른 서버보다 시작하기가 훨씬 쉽습니다. 빠른 소개는 Comet and StreamHub 시작하기 자습서 를 확인하십시오 . 무료로 다운로드 할 수 있지만 동시 사용자는 20 명으로 제한되는 Community Edition을 사용할 수 있습니다. 상용 버전은 지원만으로도 가치가 있으며 SSL 및 Desktop .NET 및 Java 클라이언트 어댑터도 제공합니다. 도움말은 Google 그룹을 통해 제공됩니다, 인터넷에는 많은 자습서가 있으며 GWT Comet 어댑터 도 있습니다.


1
확실히가는 길, 일단 스스로 구현하면 재 연결, 긴 폴링, 스트리밍 iframe, 크로스 브라우저 지원, HTTPS ...
Corehpf

2
혜성에 대한 설명은이 답변에 도움이 될 것입니다.
Kevin Monk

1
@Satir : 간단한 설명이 추가되었습니다. 다른 답변에는 Wikipedia 기사에 대한 링크가 있습니다.
Nosrama

32

요즘에는 WebSocket을 사용해야합니다. 이것은 2011 년 표준으로 HTTP와의 연결을 시작한 다음 양방향 클라이언트-서버 메시지 기반 통신으로 업그레이드 할 수 있습니다.

자바 스크립트에서 쉽게 연결을 시작할 수 있습니다.

var ws = new WebSocket("ws://your.domain.com/somePathIfYouNeed?args=any");
ws.onmessage = function (evt) 
{
  var message = evt.data;
  //decode message (with JSON or something) and do the needed
};

서버 측 처리는 테크놀로지 스택에 따라 다릅니다.



8
전적으로 동의합니다 ... 양방향 통신에 HTTP를 사용하는 것은 마리오가 거북이 껍질을 뛰어 넘기 위해 REST 호출에서 생각하는 것과 같습니다 ... 그것은 광기입니다. 간단한 버튼 누름만으로 요청을하고 응답을 기다릴 필요가 없습니다 .... 당신은하지 않습니다. HTTP는 문서 프로토콜입니다. 하이퍼 텍스트 전송 프로토콜. Ajax Push는 WebSocket이 의도 한 기능을 수행하기 위해 HTTP를 우회하는 매우 복잡한 방법입니다. 구피를 멈추고 작업에 적합한 도구를 사용하십시오.
Nick Steele

당신은 정말 타원을 좋아하고 때로는 "ellipsos"라고 부르는 새로운 형태의 4 개의 점을 좋아합니다!
imbatman

10

기본적으로 "역 Ajax"인 Comet (Ajax가 클리닝 에이전트이고 Comet이라는 사실에 대한 스푸핑)을 살펴보십시오. 각 사용자가 알림을 받으려면 서버 연결이 오래 지속되어야하므로 앱을 작성할 때 성능에 미치는 영향을 알고 있어야합니다.

http://en.wikipedia.org/wiki/Comet_(programming)



5

나는 Comet에 약간의 시간을 투자 할 것을 강력히 제안하지만, 당신이 사용할 수있는 실제 구현이나 라이브러리를 모른다.

라이브 Callcenter의 에이전트 및 콜 큐 상태 업데이트와 관련된 웹 앱의 일종의 "콜센터 제어판"을 위해 작동하지만 사용할 수있는 라이브러리와는 거리가 먼 사내 솔루션을 개발했습니다.

우리가 한 일은 전화 시스템과 통신하고 새로운 이벤트를 기다리며 상황의 사진을 유지하는 작은 서비스를 서버에 구현하는 것이 었습니다. 이 서비스는 작은 웹 서버를 제공합니다.

우리의 웹 클라이언트는 HTTP를 통해이 웹 서버에 연결하고 마지막 사진 (XML로 코딩)을 요청한 다음 다시 표시하여 새 사진을 요청합니다. 이 시점에서 웹 서버는 다음을 수행 할 수 있습니다.

  • 새 사진이있는 경우 반환
  • 이벤트가 발생하고 사진이 변경 될 때까지 몇 초 동안 클라이언트를 차단하십시오 (설정에서 30). 해당 시점에 이벤트가 생성되지 않은 경우 동일한 사진을 반환하며 연결이 활성 상태를 유지하고 클라이언트 시간이 초과되지 않도록합니다.

이렇게하면 클라이언트가 폴링 할 때 최대 0 초에서 30 초 이내에 응답을받습니다. 새 이벤트가 이미 생성 된 경우 즉시 가져옵니다. 그렇지 않으면 새 이벤트가 생성 될 때까지 차단됩니다.

기본적으로 폴링이지만 웹 서버가 과열되지 않도록 다소 똑똑한 폴링입니다. Comet이 당신의 대답이 아니라면, 동일한 아이디어를 사용하지만 더 나은 결과를 위해 더 광범위하게 AJAX를 사용하거나 JSON으로 코딩 할 수 있다고 확신합니다. 이것은 AJAX 이전 시대에 설계되었으므로 개선의 여지가 많이 있습니다.

누군가가 이것의 실제 경량 구현을 제공 할 수 있다면, 좋습니다!


5

Comet의 흥미로운 대안은 Flash에서 소켓을 사용하는 것입니다.




2

다른 방법이 있습니다. 그들이 당신의 상황에서 "더 나은"지 확실하지 않습니다. 페이지로드시 서버에 연결하고 서버가 물건을 보낼 때까지 기다리는 Java 애플릿이있을 수 있습니다. 시작시 상당히 느리지 만 브라우저가 폴링없이 서버에서 데이터를 자주받지 못하게합니다.


2

서버 쪽의 BlazeDS 또는 LiveCycle과 함께 클라이언트에서 Flash / Flex 응용 프로그램을 사용할 수 있습니다. RTMP 연결을 사용하여 클라이언트에 데이터를 푸시 할 수 있습니다. RTMP는 비표준 포트를 사용합니다. 그러나 포트가 차단되면 폴링으로 쉽게 넘어갈 수 있습니다.


2

지속적인 http 연결을 사용하여 목표로하는 것을 달성 할 수 있습니다.

Wikipedia에서 Comet 기사 를 확인하십시오 . 시작하기에 좋은 곳입니다.

많은 정보를 제공하지는 않지만 일종의 이벤트 중심 사이트 (a'la digg spy) 또는 그 라인을 따라 무언가를 구축하려는 경우 숨겨진 IFRAME을 구현하는 것을 볼 수 있습니다. 연결이 닫히지 않는 URL이며 업데이트를 수행하기 위해 서버에서 클라이언트로 스크립트 태그를 푸시합니다.



1

서버에 대한 연결이 열리면 서버를 열어 둘 수 있으며 서버는 오래 전에 사용하여 내용을 푸시 할 수 multipart/x-mixed-replace있지만 IE에서는 작동하지 않습니다.

나는 변경되지 않은 헤더를 보내지 않고 연결을 열린 채로 두어 폴링과 같이 작동하는 폴링으로 영리한 일을 할 수 있다고 생각하지만 결코 한 적이 없습니다.





당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.