XMPP 애플리케이션의 스레딩 구현을 연구할 수 있는 좋은 소스는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/107772

  •  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 용어에서는 이를 프로세스라고 부르지만 이는 보호된 메모리 주소 공간이 아니라 경량 사용자 공간 스레드입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top