2011-07-30 2 views
2

클라이언트가 계속 반복하여 데이터를 확인하지 않고도 서버에서 클라이언트로 데이터를 지속적으로 보내고 싶습니다 (스트리밍). 나는 이것이 관찰자 디자인 패턴이라고 믿는 것이 옳다고 생각한다. 이것이 어떻게 가능한지?C++에서 옵저버 디자인 패턴 스트리밍 데이터를 구현하려면 어떻게해야합니까?

누군가 Google에서 할 수있는 것들의 목록을 제공 할 수 있습니까? 관찰자 패턴 aspect는 어떻게 구현됩니까?

감사

+0

[Boost.Signals2] (http://www.boost.org/doc/libs/1_47_0/doc/html/signals2.html)를 보았습니까? – Praetorian

답변

3

관찰자 디자인 패턴이 약간 다른 무엇을 설명하고 각 관찰자는 "관찰"개체로 통보 가져옵니다

enter image description here

참고; 그래서 당신은 지속적으로 데이터를 스트리밍하는 서버를 가지고 있다면, 서버가 당신에게 "통지"하고 서버가 당신에게 통지 할 것으로 예상 할 것이라고 기대합니까? 당신에게 보내는 모든 패킷? 모든 패킷 덩어리?

요컨대, 아니오, 클라이언트/서버 응용 프로그램에서 관찰자 패턴을 구현할 수 없습니다. 서버가 클라이언트 응용 프로그램에서 알림 메소드를 호출 할 수있는 방법이 없으며 클라이언트의 연결이 끊어지면 관찰 가능 객체에서 등록이 취소되지 않습니다.

귀하의 질문에 다시 ... 당신은 아키텍처에 의해 제한을받습니다. 블로킹 소켓 (tcp/udp)은 데이터를받을 때까지 블로킹하여 모두 작동합니다. 데이터를 받으면 반복적으로 더 많은 데이터를 얻기 위해 루프를 거쳐 다시 수신해야합니다.

비동기 소켓 통신은 아마도 관찰자 패턴에 가까워 질 것입니다. 또한 스트리밍 데이터가 있고 UDP가 스트리밍 데이터 용으로 특별히 설계 되었기 때문에 UDP 프로토콜을 사용하려고합니다. UDP를 신뢰할 수 없기 때문에 패킷을 놓치지 않으려면 reliable UDP을 사용할 수 있습니다.

+0

+1 to async 소켓 – RocketR

+0

안녕하세요. 좋아, 어쩌면 내가 관찰자 패턴을 언급해서는 안된다.서버가 많은 초마다 서버를 폴링 할 필요없이 서버가 데이터를 보내자 마자 클라이언트가 데이터를 받길 원합니다? – Paul

+0

@Paul, 비동기 소켓은 정상적으로 작동하며 블로킹 소켓은 일정 시간 (즉, 읽을 데이터가있을 때까지 소켓 블럭)을 폴링하지 않아도됩니다. 나는 당신이 일정 기간 동안 투표하는 시간의 99 %가 "당신이 잘못하고있다"고 말합니다. :) – Kiril

0

통신 프로토콜이 완전히 다르기 때문에 클라이언트/서버 유스 케이스에 대한 관찰자 패턴을 구현할 수 없습니다. (RPC는 적합하지만 TCP를 사용하고 있습니다.)

어쨌든 할 수있는 것은 데이터 수신 전용 TCP 클라이언트가 있어야한다는 것입니다. 이 TCP 클라이언트이며 내부 클래스가 함께 Observer 패턴을 구현할 수 있습니다. 이것으로 클래스는 더 이상 데이터를 기다릴 필요가 없습니다.

내가 알고있는 것처럼 Shash

0

, 여기에 주요 관심사는 클라이언트 응용 프로그램이 서버에서 데이터를 기다리는 차단하지 않아야합니다. 이를 위해 소켓 이벤트에 작용할 하나의 스레드를 생성 할 수 있습니다. 이 스레드 모듈로 클래스 컨텍스트를 등록 할 수 있으며 데이터가 수신 될 때마다이 스레드 모듈은 등록 된 컨텍스트를 사용하여 콜백 (알림)을 할 수 있습니다.