3

InputStream含まれている XML をクライアントからサーバーに送信したいと考えています。上記のサーバーは、XML ストリームを使用して操作し、Streaming API for XML (StAX)それをクライアントに送り返します。

XML をサーバーに送信すると、クライアントは応答を受け取りますが、サーバーがクライアントからのInputStreamフォームの読み取りを終了しないため、終了しません。しかし、サーバーがSystem.out何かを送信する代わりに入力をダンプしているだけの場合、読み取りは終了します...

編集IOUtils.copy()クライアント上の2つの別々のスレッドで実行されていることを忘れてい

これを再現するためのコードを次に示します。サーバー上のStAX部分を置き換えました。IOUtils.copy()

サーバ

ServerSocket serverSocket = new ServerSocket(port);
Socket clientSocket = serverSocket.accept();

InputStream in = clientSocket.getInputStream();
OutputStream out = clientSocket.getOutputStream();
IOUtils.copy(in, out);

クライアント

Socket socket = new Socket(host, port);
FileInputStream fin = new FileInputStream(file);
OutputStream out = socket.getOutputStream();
IOUtils.copy(fin, out)

InputStream in = socket.getInputStream();
IOUtils.copy(in, System.out)
4

3 に答える 3

5

InputStream と OutputStream をフラッシュして閉じる必要があります。このような:

ServerSocket serverSocket = new ServerSocket(port);
Socket clientSocket = serverSocket.accept();

InputStream in = clientSocket.getInputStream();
OutputStream out = clientSocket.getOutputStream();
IOUtils.copy(in, out);

//add 
out.flush();
in.close();
out.close;
于 2013-02-17T08:15:55.530 に答える
3

おそらくデッドロックを作成しています。

  • クライアント - サーバーにデータを送信します。
  • サーバー - データをクライアントにループバックします。
  • クライアント - データを読み取ります (サーバーがループバックした)

したがって、クライアントがサーバーにデータを送信している間、サーバーはそれをクライアントに送り返します。クライアントはそのデータを読み取っていません。送信中です。

ある時点で TCP バッファがいっぱいになり、サーバーはクライアントへの追加データの送信をブロックします。これは、サーバーがデータの送信をブロックされていることを意味するため、最終的にはサーバーの受信側の TCP バッファーもいっぱいになり、クライアントはデータの送信をブロックします。クライアントは送信時にブロックされているため、ループバックされたデータを読み取る部分に到達することはなく、サーバーはブロックを解除しません。

小さなドキュメントを送信している場合、すべてのデータがバッファーに収まるため、これは発生しない可能性がありますが、バッファーがいっぱいになると、システムはデッドロックします。

送受信を多重化する必要があります。たとえば、クライアントでスレッドを開始できます

InputStream in = socket.getInputStream();
IOUtils.copy(in, System.out)

そうすれば、クライアントがデータを送信するのと並行して受信を行うことができます

または、サーバー側で 2 つのスレッドを使用することもできます。1 つはデータを受信し、データを送信して別のスレッドに送り返すためのものです (この場合、スレッド間で内部キューを作成する必要があります)。

于 2010-12-01T15:03:38.877 に答える
1

私が覚えている限りIOUtils.copy()、ストリームをフラッシュせず、閉じません。フラッシュもクローズも呼び出していないようです。それを試してみてください。これはあなたの問題だと思います。

于 2010-12-01T15:24:32.043 に答える