私の理解では、XMPPプロトコルは常時接続に基づいており、XMLメッセージがいつ終了するかを即座に示すことはできません。
これは、ストリームが来たときにそれを評価する必要があることを意味します。これは、メッセージの長さや接続が遅いために、ソケットがXMLメッセージの途中でブロックされる可能性があるため、おそらく非同期接続を処理する必要があることも意味します。
回答ごとに1つのソースをいただければ幸いです。そうすれば、それらを変更して、お気に入りが何であるかを確認できます。
私の理解では、XMPPプロトコルは常時接続に基づいており、XMLメッセージがいつ終了するかを即座に示すことはできません。
これは、ストリームが来たときにそれを評価する必要があることを意味します。これは、メッセージの長さや接続が遅いために、ソケットがXMLメッセージの途中でブロックされる可能性があるため、おそらく非同期接続を処理する必要があることも意味します。
回答ごとに1つのソースをいただければ幸いです。そうすれば、それらを変更して、お気に入りが何であるかを確認できます。
一度に複数の接続を処理したいですか? その場合、接続ごとに 1 つのスレッドを回避するために、適切な非同期ソケット処理が必須です。
それ以外の場合は、一度に大量のバイトを処理できる XML パーサーが必要です。 Expatは標準的な例です。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
このアプローチは、イベントベースまたはプル パーサーで機能するはずです。1 つのポインターに相当する状態を保持する必要があるだけです。明らかに、属性、文字データ、エンティティ参照 (& など)、および特殊な用途の stream:stream タグも処理する必要がありますが、これで作業を開始できます。
Igniterealtime.orgは、Javaで記述されたオープンソースのXMPPサーバーおよびクライアントを提供します
ejabberdはErlangで書かれています。ejabberdの実装の詳細はわかりませんが、Erlangを使用する利点の1つは、非常に安価なスレッドです。XMPP接続ごとにスレッドを開始すると推測します。Erlangの用語では、これらはプロセスと呼ばれますが、これらは保護されていません。メモリアドレス空間は軽量のユーザー空間スレッドです。