XMPP 애플리케이션의 스레딩 구현을 연구할 수 있는 좋은 소스는 무엇입니까?
-
01-07-2019 - |
문제
제가 이해한 바에 따르면 XMPP 프로토콜은 XML 메시지가 끝나는 시점을 즉각적으로 알 수 없는 상시 연결을 기반으로 합니다.
이는 스트림이 나오는 대로 평가해야 함을 의미합니다.이는 또한 메시지 길이나 연결 속도 저하로 인해 XML 메시지 중간에 소켓이 차단될 수 있으므로 비동기 연결을 처리해야 한다는 의미이기도 합니다.
답변당 하나의 소스를 선택하여 수정하고 가장 좋아하는 것이 무엇인지 확인할 수 있도록 해주시면 감사하겠습니다.
해결책
한 번에 여러 연결을 처리하고 싶습니까?이 경우 연결당 하나의 스레드를 피하려면 좋은 비동기 소켓 처리가 필수입니다.
그렇지 않으면 한 번에 한 덩어리의 바이트를 처리할 수 있는 XML 파서만 있으면 됩니다. 국외 거주자 표준적인 예입니다.Java에 있다면 시도해보십시오. XP.이러한 유형의 XML 파서는 가능한 한 이벤트를 발생시키고 나머지 스탠자가 도착할 때까지 부분 스탠자를 버퍼링합니다.
이제 다음과 같은 경우 알림이 없다는 귀하의 주장을 해결해 보겠습니다. 절 결국 그것은 사실이 아닙니다.중요한 것은 XML 스트림을 일련의 문서인 것처럼 처리하지 않는 것입니다.다음 의사 코드를 사용하십시오.
stanza = null
while parser has more:
switch on token type:
START_TAG:
elem = create element from parser state
if stanza is not null:
add elem as child of stanza
stanza = elem
END_TAG:
parent = parent of stanza
if parent is not null:
fire OnStanza event
stanza = parent
이 접근 방식은 이벤트 기반 또는 풀 파서에서 작동해야 합니다.상태에 해당하는 하나의 포인터만 유지하면 됩니다.당연히 속성, 문자 데이터, 엔터티 참조(예: &등) 및 특수 목적의 stream:stream 태그가 있지만 시작하는 데 도움이 될 것입니다.
다른 팁
Igniterealtime.org는 Java로 작성된 오픈 소스 XMPP 서버 및 클라이언트를 제공합니다.
ejabberd Erlang으로 작성되었습니다.나는 ejabberd 구현의 세부 사항을 모르지만 Erlang을 사용하는 것의 한 가지 장점은 정말 저렴한 스레드입니다.나는 그들이 XMPP 연결마다 스레드를 시작한다고 추측합니다.Erlang 용어에서는 이를 프로세스라고 부르지만 이는 보호된 메모리 주소 공간이 아니라 경량 사용자 공간 스레드입니다.