클라이언트 요청없이 서버에서 클라이언트로 데이터를 푸시합니까?


11

Stack Exchange를 탐색하는 동안 "3 개의 새 메시지, 클릭하여 표시"와 같은 동적 알림이 있음을 알았습니다. 설명하려는 내용에 대해 이러한 종류의 동적 업데이트를 원합니다.

최근 10 개의 최신 뉴스 기사가있는 슬라이드 쇼 / 슬라이드 쇼를 만들고 싶다고 가정 해 보겠습니다. 이 회전식 메뉴가 매시간 업데이트됩니다. 최신 기사는 오래된 기사를 대기열에서 밀어냅니다. 내 머리 꼭대기에서 해결책이 될 것입니다.

  1. 사용자가 클라이언트에 로그온합니다.
  2. 고객은 다음 시간 표시까지 분 수를 계산하고 시간에 실행되도록 타이머를 설정합니다.
  3. 시간 표시에, 캐 러셀에없는 새로운 뉴스 기사 에 대한 요청을 서버에 보냅니다 .
  4. 응답을 처리하십시오.
  5. 타이머를 재설정하십시오.

이것이 적합한 전략입니까? 클라이언트 요청에 의존하지 않고이를 달성 할 수 있습니까? 다시 말해 Stack Exchange는 어떻게 동적 업데이트를 수행합니까?


4
SignalR을 살펴보십시오.
Robert Harvey

아이디어를 얻으 려면 RSSAJAX 를 읽어 보는 것이 좋습니다 . RSS는 구독 피드에 대한 표준 프로토콜의 예이며 AJAX는 페이지를 다시로드하지 않고 클라이언트 (브라우저)를 업데이트하는 방법에 대한 고급 개념입니다. 이것이 Stack Exchange의 작동 방식입니다.

1
@Snowman Stack Exchange는 WebSocket을 사용합니다 . 참조 meta.stackexchange.com/questions/10369/...을
로버트 하비에게

클라이언트가 브라우저, 사용자 정의 클라이언트 또는 다른 것입니까?
outis

다소 사용자 적대적이지만 15 분마다 HTML 페이지를 새로 고칠 수 있습니다. 대부분의 뉴스 웹 페이지가이를 수행합니다.
길버트 르 블랑

답변:


7

데이터를 푸시하려면 클라이언트를 식별해야하며 클라이언트를 서버에 등록하면됩니다. 완료되면 지속적으로 연결된 구독 클라이언트 목록이 나타납니다.

달성하고자하는 것에 따라 클라이언트가 서버에 요청하는 것이 가장 좋습니다. 따라서 지속적인 연결을 유지하고 요청 / 응답 통신 프로토콜을 HTTP로 사용할 필요가 없습니다.

지속적인 연결을 유지해야하는 한 가지 예는 실시간 채팅 / 인스턴트 메시징 시스템입니다.

지속적인 연결은 일반적으로의 사용을 통해 sockets구현되므로 자체 통신 프로토콜, 암호화 등을 구현할 때 오버레이가 추가됩니다.


2

기본적으로 데이터를 클라이언트에 푸시해야하며 양방향 통신이 http 프로토콜의 범위에 있지 않으므로 자체적으로 구현하기가 쉽지 않습니다.

문제의 해결책은 socket.io입니다.

웹 사이트에 명시된 바와 같이

"Socket.IO는 실시간 양방향 이벤트 기반 통신을 가능하게합니다. 모든 플랫폼, 브라우저 또는 장치에서 작동하며 안정성과 속도에 똑같이 중점을 둡니다."

이것이 문제를 해결할 수 있기를 바랍니다.


7
socket.io와 관련이 있는지 여부와 방법을 설명하고 프레임 워크에 대한 지식 / 경험을 기반으로 질문자 문제를 해결하는 데 도움이되는 방법을 설명하면 도움이 될 것입니다 (웹 사이트의 "미션 진술"과는 대조적으로)
Benni

모든 주요 브라우저가 표준을 구현하므로 WebSocket은 Socket.IO보다 선호됩니다. 대부분의 주요 언어에는 웹 소켓 구현이 있지만 socket.io 언어는 없습니다. Socket.io는 메시지에 추가 구조를 추가하므로 쉽게 호환되지 않습니다.
Alex Reinking

1

SE는 웹 사이트이기 때문에 시간이 지남에 php / asp / what-have-you 스크립트를 실행하여 데이터를 푸시하는 cron 작업 세트를 포함 할 수있는 몇 가지 방법이 있지만 SE가 어떻게하는지 말할 수 없습니다. 그러나 이것은 웹 전용 솔루션을 찾고 있다면 가능합니다.

그러나 클라이언트를 언급했기 때문에 해당 클라이언트에 대한 최신 뉴스 업데이트 날짜 / 시간으로 파일을 작성하고 클라이언트가 해당 파일에 저장된 값을 확인하고 사용자의 시스템 시간과 비교하여 시간이 있는지 확인할 수 있습니다. 마지막 업데이트 이후에 통과했습니다. 한 시간 이상인 경우 클라이언트는 서버에서 최신 뉴스 스트림을 요청한 다음 최신 뉴스 스트림을 클라이언트로 리턴합니다.

사용자가 타이머를 계속 실행하기 위해 클라이언트를 열어 둔 경우에만 해당 방법이 작동하므로 타이머를 사용하거나 최소한 타이머를 사용하지 않는 것이 좋습니다. 그러나 내가 제안한대로 파일을 가지고 있다면 파일을 열 서브 루틴을 만들고 변수에 시간을 저장하고 시스템 시간과 비교하고 적어도 1 시간이 지난 경우 요청을 할 수 있습니다. 그런 다음 특정 이벤트와 관련하여 단순히 서브를 호출합니다. 사용자가 클라이언트를 다시 시작하면 최신 뉴스를 원하기 때문에 양식로드에서 확실히 호출합니다. 그들이 클라이언트에 온 후 며칠이 지났다면, 그 뉴스를 보여주는 것입니다. 최소한 하위를 클라이언트로드에 연결하고 제안한대로 타이머를 시작하십시오.

당신이 무엇을하는지 완전히 확신하지 못해서 당신이 뭘했는지 잘못 이해하면 사과드립니다. 그러나 희망적으로 여기에 당신에게 가치있는 것이 있습니다!

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