0
ユーザーがファイルをアップロードしてダウンロードできるシンプルなサーバークライアントプログラムを作成しようとしています。ソケットとストリームが動作するようになっていて、ファイルをサーバーにアップロードできます。しかし、1つのファイルがアップロードされるたびに、サーバー側はストリームを読み込んでサーバーファイルに転送するループに詰まっているように見えます。JavaでSocket経由のファイル転送がwhileループから外れることはありません
サーバコード:
InputStream in = clientSocket.getInputStream();
String filePath = "......."
+ op[1];
System.out.println(op[0] + ": " + filePath);
FileOutputStream out = new FileOutputStream(filePath);
byte[] bytes = new byte[16*1024];
int count;
while ((count = in.read(bytes)) > 0) {
out.write(bytes, 0, count);
}
クライアントコード:
String filePath = "...."
+ path;
System.out.println("Attempting: " + filePath);
dos = new DataOutputStream(serverSocket.getOutputStream());
fis = new FileInputStream(filePath);
byte[] buffer = new byte[4096];
while (fis.read(buffer) > 0) {
dos.write(buffer);
}
dos.flush();
fis.close();
問題は、プログラムがwhileループで立ち往生、そのサーバーが何かを行うことができないということです。エラーや何もありません。
ありがとう、それはwhileループを終了するプログラムを持っています。ただし、クライアントとサーバー間のソケット接続も閉じられます。 3つのファイルを連続してアップロードできるプログラムを用意したいと思います。各アップロード後にソケットを閉じると、再び接続する必要があります。これを回避する方法はありますか、または各リクエストのためにサーバーに接続するだけですか? –
サーバーがファイルの境界を認識できるようにするプロトコルを定義することができます。たとえば、各ファイルの前にファイルサイズを送信するようにストリームを設定できます。サーバーの読み取りループでは、これを考慮する必要があります。 "オフシェルフ" Java実装のさまざまなファイル転送プロトコルが存在するため、これを学習の練習としてやっていることを前提としています。 –