2008-09-20 2 views
2

XMPP 프로토콜은 XML 메시지가 끝나는 시점에 대한 즉각적인 표시가없는 상시 접속 (always-on connection)을 기반으로합니다.XMPP 응용 프로그램의 스레딩 구현을 연구하기에 좋은 소스는 무엇입니까?

즉, 스트림을 평가해야합니다. 이는 메시지 길이 또는 연결 속도가 느려서 XML 메시지의 중간에서 소켓이 차단 될 수 있기 때문에 비동기 연결을 처리해야한다는 것을 의미합니다.

답변 당 하나의 소스가 좋으므로 수정하여 가장 좋아하는 것이 있는지 확인할 수 있습니다.

답변

1

한 번에 여러 연결을 처리하고 싶습니까? 이 경우 좋은 비동기 소켓 처리가 필요하며 연결 ​​당 하나의 스레드를 피하십시오.

그렇지 않으면 한 번에 여러 바이트를 처리 할 수있는 XML 구문 분석기가 필요합니다. Expat이 표준 예입니다. Java 사용자라면 XP을 사용해보십시오. 이러한 유형의 XML 파서는 가능하면 이벤트를 실행하고 나머지가 도착할 때까지 부분 스탠자를 버퍼링합니다.

스 D 자이 종료 될 때 알림이 없음을 알리기 위해 실제로는 사실이 아닙니다. 중요한 것은 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 

이 접근법은 이벤트 기반 또는 끌어 오기 구문 분석기에서 작동합니다. 하나의 상태 값만 유지하면됩니다. 물론 속성, 문자 데이터, 엔티티 참조 (예 : & amp 등)를 처리하고 stream : stream 태그를 특수하게 사용해야하지만 시작해야합니다.

0

Igniterealtime.org 자바

+0

원본을 보는 것이 나에게 상당히 유용하지만,이 경우 데이터의 선형성을 처리하는 데 필요한 정보가 필요합니다. 어쨌든 고마워, . –

0

ejabberd로 작성된 오픈 소스 XMPP 서버와 클라이언트가 얼랑로 작성된 것입니다 제공합니다. 나는 ejabberd 구현의 세부 사항을 알지 못하지만, Erlang을 사용하면 얻을 수있는 이점 중 하나는 정말 저렴한 스레드입니다. 나는 그들이 XMPP 연결 당 스레드를 시작한다고 추측 할 것이다. 얼랭 (Erlang) 용어로는 프로세스라고 부르지 만 가벼운 사용자 공간 스레드 인 보호 메모리 주소 공간이 아닙니다.

관련 문제