GLOOX 1.0 심장 박동
3721 단어 XMPP 프로 토 콜
2011 - 08 - 25 ----- 새 문서
일반적으로 클 라 이언 트 와 서버 사이 에 심장 박동 이 연결 되 어야 합 니 다. XMPP 는 확장 프로 토 콜 XEP - 0199 를 통 해 클 라 이언 트 와 서버 측의 심장 박동 을 실현 할 수 있 습 니 다.XEP - 0199 는 네 임 스페이스 를 'urn: xmpp: ping' 으로 보 내 는 iq 절 XML 흐름 을 통 해 이 문 제 를 해결 하도록 규정 하고 있다.이 코드 는 테스트 코드 입 니 다.
본 고 는 GLOOX 클 라 이언 트 가 서버 메시지 에 대한 패 키 징 을 논술 한다.
클 라 이언 트 가 서버 에 ping 메 시 지 를 보 냅 니 다:
서버 응답 pong:
서버 가 ping 네 임 스페이스 를 지원 하지 않 으 면 error 를 되 돌려 야 합 니 다:
포장 사고:
프로그램 에서 다른 스 레 드 는 심장 박동 처리 에 사용 된다.GLOOX 라 이브 러 리 에서 XEP - 0199 의 ping 을 보 내 는 것 은 Client Base 클래스 의 한 방법 입 니 다.
void xmppPing
(
const JID &
to,
EventHandler *
eh
)
이 방법 을 설명 하기 전에 GLOOX 의 몇 가지 관련 유형 을 소개 합 니 다.
Client Base: 이 클래스 에 서 는 xmppPing 으로 XEP - 0199 ping 메 시 지 를 보 냅 니 다.
EventHandler: ping 이벤트 프로세서, 관찰자, 순수 가상 클래스.가상 함 수 를 실현 하면 Ping 응답 을 받 을 때 처리 할 수 있 습 니 다.
EventDispatcher: ping 이벤트 배포 기, EventHandler 등록 및 로그아웃 에 사용 합 니 다.
이벤트: ping 이벤트 패키지 클래스.
방법 설명: Sends a XMPP Ping (XEP - 0199) to the given JID. 즉, xep - 0199 규범 에 맞 는 ping 메 시 지 를 지정 한 JID 에 보 냅 니 다.우 리 는 서버 에 대한 심장 박동 을 하기 때문에 이곳 의 JID 가 서버 의 JID 입 니 다.EventHandler 는 관찰자 (디자인 모델 의 관찰자 모델) 로 xmppPing 의 실현 에 있어 EventDispatcher 대상 이 관찰 자 를 등록 하고 사건 을 받 을 때 EventDispatcher 가 사건 을 관찰 자 에 게 나 누 어 처리한다.그래서 우 리 는 관찰자 EventHandler 를 실현 해 야 한다.
관찰자 구현:
class CEventHandler:public EventHandler
{
public:
CEventHandler();
virtual ~CEventHandler();
virtual void handleEvent(const Event& event);
void increaceHeartBeatCount(void);
UINT getHeartBeatCount(){return m_nCount;}
private:
void decreaceHeartBeatCount(void);
UINT m_nCount;
};
CEventHandler::CEventHandler():m_nCount(0)
{
}
CEventHandler::~CEventHandler()
{
}
void CEventHandler::increaceHeartBeatCount()
{
m_nCount++;
return;
}
void CEventHandler::decreaceHeartBeatCount()
{
if (m_nCount > 0)
{
m_nCount--;
}
return;
}
void CEventHandler::handleEvent(const Event& event)
{
std::string sEvent;
switch (event.eventType())
{
case Event::PingPing: //! PING
sEvent = "PingPing";
break;
case Event::PingPong: //! PONG , 1
sEvent = "PingPong";
decreaceHeartBeatCount();
break;
case Event::PingError: //!
sEvent = "PingError";
break;
default:
break;
}
TRACE("handleEvent:-------------%s
", sEvent.c_str());
return;
}
심장 박동 라인:
UINT MessageTest::heartBeatThread(LPVOID lpParam)
{
MessageTest* pThis = (MessageTest*)lpParam;
if(NULL == pThis)
return -1;
CEventHandler* pEventHandler = new CEventHandler();
while (!pThis->m_bDisConnect)
{
//! ,
if (pEventHandler->getHeartBeatCount() > 3)
{
break;
}
pThis->m_client->xmppPing(JID("talk.google.com"), pEventHandler);
pEventHandler->increaceHeartBeatCount();
Sleep(10*1000); //! T
}
delete pEventHandler;
TRACE("
");
return 0;
}
심장 박동 에 관 한 다른 메커니즘, 예 를 들 어 심장 박동 시간 간격, 체인 연결 등 처 리 는 구체 적 인 항목 에 따라 상기 코드 를 수정 해 야 한다.