2

クライアントがファイルに関する情報(送信者名、説明など)とともにファイルをサーバーに送信できるようにするクライアントサーバープログラムを作成したいと思います。

ファイルは、テキスト、画像、オーディオ、またはビデオファイルのいずれかである可能性があるため、非常に大きくなる可能性があります。そのため、送信する前にファイル全体をバイト配列に読み取る必要がないため、ファイルを読み取る方がよいでしょう。ブロック単位で、それらをネットワーク経由で送信し、サーバーがブロックをファイルの最後に追加できるようにします。

ただし、ファイル自体に関するいくつかの情報とともにファイルを最適に送信する方法の問題に直面しています。少なくとも送信者の名前と説明を送信したいのですが、どちらもユーザーがクライアントプログラムに入力しますが、将来変更される可能性があるため、柔軟に対応する必要があります。

ファイル全体を読み込んで送信するのではなく、送信中のファイルを「ストリーミング」できるようにする、これを行うための良い方法は何ですか?

4

3 に答える 3

2

ソケットはネイティブにバイトのストリームであるため、問題は発生しません。このようなプロトコルを使用することをお勧めします。

これにより、全長が64 KB未満である限り、任意のプロパティを送信できます。その後に、任意の63ビット長のファイルが続き、一度に1ブロックずつ送信されます。(8 KBのバッファーを使用)

必要に応じて、ソケットを使用してさらにファイルを送信できます。

DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
Properties fileProperties = new Properties();
File file = new File(filename);

// send the properties
StringWriter writer = new StringWriter();
fileProperties.store(writer, "");
writer.close();
dos.writeUTF(writer.toString());

// send the length of the file
dos.writeLong(file.length());

// send the file.
byte[] bytes = new byte[8*1024];
FileInputStream fis = new FileInputStream(file);
int len;
while((len = fis.read(bytes))>0) {
    dos.write(bytes, 0, len);
}
fis.close();
dos.flush();

読む

DataInputStream dis = new DataInputStream(socket.getInputStream());
String propertiesText = dis.readUTF();
Properties properties = new Properties();
properties.load(new StringReader(propertiesText));
long lengthRemaining = dis.readLong();
FileOutputStream fos = new FileOutputStream(outFilename);
int len;
while(lengthRemaining > 0 
   && (len = dis.read(bytes,0, (int) Math.min(bytes.length, lengthRemaining))) > 0) {
      fos.write(bytes, 0, len);
      lengthRemaining -= len;
}
fos.close();
于 2011-02-17T19:40:41.990 に答える
0

FTPとしてよく知られているプロトコルを中心にプログラムを構築できます。また、メタ情報を送信するには、情報を含む一意の名前の特別なファイルを作成するだけです。その後、FTPでユーザーファイルとメタファイルの両方を転送します。

それ以外の場合は、ファイルにFTPを使用して、手書きプログラムのクライアントサーバーストリームのメタデータを転送できます。

于 2011-02-17T19:41:43.083 に答える
0

これにはhttpプロトコルを使用することをお勧めします。サーバーはサーブレットを使用して実装でき、ApacheHttpClientをクライアントに使用できます。この記事にはいくつかの良い例があります。同じリクエストでファイルとパラメータの両方を送信できます。そして、それも非常に少ないコードで!

于 2011-02-17T19:50:18.693 に答える