1

サーバーがクライアントにいくつかのファイルを送信しています。ただし、クライアント側では、2番目のファイルを繰り返し取得する方法がわからないため、最初のファイルのみを受け取ります。

サーバーは次のように送信します。

ListIterator iter = missingfiles.listIterator(); 
                    //missingfiles contain all the filenames to be sent
String filename;
while (iter.hasNext()) {
    // System.out.println(iter.next());
    filename=(String) iter.next();
    File myFile = new File("src/ee4210/files/"+filename); 
    byte[] mybytearray = new byte[(int) myFile.length()];  

    FileInputStream fis = new FileInputStream(myFile);  
    BufferedInputStream bis = new BufferedInputStream(fis);  
    //bis.read(mybytearray, 0, mybytearray.length);  

    DataInputStream dis = new DataInputStream(bis);     
    dis.readFully(mybytearray, 0, mybytearray.length);  

    OutputStream os = _socket.getOutputStream();  

    //Sending file name and file size to the server  
    DataOutputStream dos = new DataOutputStream(os);     
    dos.writeUTF(myFile.getName());     
    dos.writeLong(mybytearray.length);     
    dos.write(mybytearray, 0, mybytearray.length);     
    dos.flush(); 
}

クライアントは次のように受信します:(最初のファイルのみを受信し、次のファイルを受信するためにループさせる方法がわかりません)

int bytesRead;
int current = 0;
int filecount = 0;
InputStream in;
try {
    in = _socket.getInputStream();
    DataInputStream clientData = new DataInputStream(in);
        String fileName = clientData.readUTF();
        OutputStream output = new FileOutputStream(
                               "src/ee4210/files/"+ fileName);
        long size = clientData.readLong();
        byte[] buffer = new byte[1024];
        while (size > 0
                && (bytesRead = clientData.read(buffer, 0,
                        (int) Math.min(buffer.length, size))) != -1) {
            output.write(buffer, 0, bytesRead);
            size -= bytesRead;
        }
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
4

2 に答える 2

0

出力ストリームから複数のファイルを受け取る方法は?

明白な答えは、「一度に 1 つずつ、どこで停止し、別の開始かを示す追加情報とともに」です。最も一般的な手法は、ファイルのサイズをファイルの前に送信することです。たとえば、 long via としてDataOutputStream.writeLong()、受信側で読み取りループを変更して、ちょうどそのバイト数の後に停止し、出力ファイルを閉じて、次の長いまたはストリームの終わり。

于 2013-02-28T23:38:05.197 に答える
0

これを試すことができます。遅延メソッドを使用して、3 つのファイルすべての最後が受信されたことを確認しました。

    int bytesRead;
    int current = 0;
    int filecount = 0;
    InputStream in;
    try 
    {
        in = _socket.getInputStream();
        DataInputStream clientData = new DataInputStream(in);

        while(true) 
        {
            String fileName = clientData.readUTF();
            // will throw an EOFException when the end of file is reached. Exit loop then.

            OutputStream output = new FileOutputStream("src/ee4210/files/"+ fileName);
            long size = clientData.readLong();
            byte[] buffer = new byte[1024];
            while (size > 0
                    && (bytesRead = clientData.read(buffer, 0,
                            (int) Math.min(buffer.length, size))) != -1) 
            {
                output.write(buffer, 0, bytesRead);
                size -= bytesRead;
            }
            output.close();
        }

    } 
    catch (EOFException e)
    {
        // means we have read all the files
    }
    catch (IOException e) 
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
于 2013-03-01T12:04:11.700 に答える