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; }

심장 박동 에 관 한 다른 메커니즘, 예 를 들 어 심장 박동 시간 간격, 체인 연결 등 처 리 는 구체 적 인 항목 에 따라 상기 코드 를 수정 해 야 한다.

좋은 웹페이지 즐겨찾기