10

ここのコードを使用して、ソケットを介して個々のファイルを送信しました。ただし、ソケットを介して複数のファイル(基本的にはディレクトリ内のすべてのファイル)を送信し、クライアントにファイル間の分離方法を認識させる必要があります。率直に言って、私は何をすべきか完全に途方に暮れています。ヒントがあれば役に立ちます。

注1:クライアントが個々のファイルに分離できる1つの連続したストリームでファイルを送信する方法が必要です。クライアントからの個々の要求に依存することはできません。

注2:質問に答えるために、私はコメントを受け取ると確信しています。いいえ、これは宿題ではありません。

編集ファイル自体の前にファイルのサイズを送信できることが提案されています。ソケットを介したファイルの送信は、によって返されるlongではなく、常に所定のバイト配列または個別の1バイトで行われるため、これを行うにはどうすればよいですか。File.length()

4

5 に答える 5

22

完全な実装は次のとおりです。

送信者側:

String directory = ...;
String hostDomain = ...;
int port = ...;

File[] files = new File(directory).listFiles();

Socket socket = new Socket(InetAddress.getByName(hostDomain), port);

BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
DataOutputStream dos = new DataOutputStream(bos);

dos.writeInt(files.length);

for(File file : files)
{
    long length = file.length();
    dos.writeLong(length);

    String name = file.getName();
    dos.writeUTF(name);

    FileInputStream fis = new FileInputStream(file);
    BufferedInputStream bis = new BufferedInputStream(fis);

    int theByte = 0;
    while((theByte = bis.read()) != -1) bos.write(theByte);

    bis.close();
}

dos.close();

レシーバー側:

String dirPath = ...;

ServerSocket serverSocket = ...;
Socket socket = serverSocket.accept();

BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
DataInputStream dis = new DataInputStream(bis);

int filesCount = dis.readInt();
File[] files = new File[filesCount];

for(int i = 0; i < filesCount; i++)
{
    long fileLength = dis.readLong();
    String fileName = dis.readUTF();

    files[i] = new File(dirPath + "/" + fileName);

    FileOutputStream fos = new FileOutputStream(files[i]);
    BufferedOutputStream bos = new BufferedOutputStream(fos);

    for(int j = 0; j < fileLength; j++) bos.write(bis.read());

    bos.close();
}

dis.close();

私はそれをテストしませんでしたが、うまくいくことを願っています!

于 2012-07-10T19:46:58.607 に答える
2

各ファイルの前に最初にファイルのサイズを送信することができます。これにより、クライアントは現在のファイルが終了したことを認識し、次の(サイズ)を期待します。これにより、すべてのファイルに1つの連続したストリームを使用できるようになります。

于 2012-07-10T19:26:31.303 に答える
1

これを行う非常に簡単な方法は、各ファイルを送信する前にファイルの長さを送信して、ファイル間の分離を判別できるようにすることです。

もちろん、受信プロセスがJavaの場合は、オブジェクトを送信するだけです。

于 2012-07-10T19:27:00.233 に答える
0

クライアント側でファイルを圧縮して、この圧縮されたストリームをサーバーに送信できます。

例: http: //www.exampledepot.com/egs/java.util.zip/CreateZip.html

と ...

OutputStream output = connection.getOutputStream();
ZipOutputStream out = new ZipOutputStream(output);
于 2012-07-10T19:20:58.357 に答える
0

おそらく最速の方法は、ディレクトリ内のファイルを1つのファイルに自動的に圧縮および解凍することです。java.util.zipパッケージを参照してください。

于 2012-07-10T19:22:03.490 に答える