2

JSSE を使用して SSL 接続を受け入れ、ストリーム内で単純な XML メッセージ形式を使用する Java サーバーがあります。サーバーに完全なメッセージを読み取ってから返信を送信してもらいたいです。org.xml.sax.XMLReader はストリーム全体を読み取ってから close() を呼び出す必要があるため、これは非常に困難です。奇妙に思えるかもしれませんが、Sun JSSE プロバイダーを使用する Java 6 では、SSLSocket の両端が実際に閉じられるため、メッセージを戻すことができません。クライアント側で Socket の shutdownOutput() メソッドを使用してみましたが、これは JSSE ではサポートされていません。

私の解決策は、カスタム クラスにラップされた InputStream を渡すことでした。このカスタム クラスは、クローズ リクエストを黙って無視し、最初の空白行に遭遇したときにストリームがクローズされたことを示します。これにより、XML が通常の有効範囲を超えて制限されますが、クライアントは必要に応じて入力内の空白行を簡単に除外できます。より良い解決策はありますか?

4

2 に答える 2

1

各 xml ドキュメントにはルート ノードが 1 つしかないためです。したがって、このノードの最後をスキャンしてから、ストリームを閉じます。

于 2008-11-06T20:57:07.783 に答える
1

クライアントは、メッセージが完全に読まれたことをどのように知ることができますか? 入力ストリームが最後に到達するまで読み取る必要がある場合、定義上、その後ストリームから何も読み取れません。2 つ目の注意点close()として、入力ストリームでの呼び出しはソケットを閉じるべきではありません。close()入力ストリームを呼び出したときにソケットが閉じていることを確認してください。出力ストリーム(入力ストリーム)が閉じられたことに気付いたときに、ピアによって接続が(誤って)閉じられている可能性があります。

入力ストリームの最後まで読み取らないようにする解決策は、入力メッセージを何らかの形で区切ることです。たとえば、メッセージの前にメッセージの長さを送信し、メッセージ全体をストリームからバッファに読み取り、XMLReader を使用してバッファを解析するか、指定された長さの後に最後に到達する特殊な InputStream を作成できます。データ。または、メッセージの後にストリームに特別な区切り文字を追加して、基になるストリームが区切り文字を生成するときに、その最後に到達する特別な InputStream を作成します。

于 2008-11-05T00:06:42.830 に答える