0

サーバーがファイルをクライアントに送信し、クライアントがそれを受信して​​C:/の任意の場所に保存するサーバークライアントアプリケーションを作成しました。クライアントにファイルを受信するように指示するために最初に文字列「File」を送信し、サーバーよりもファイル名とサイズをクライアントに送信してから送信を開始します。問題は、クライアントがループで読み取り、すべてのバイトを取得してもファイルを受信しないが、必要なファイルオブジェクトに書き込みを行わないことです。私が示したクライアントコードを見てください。

以下はサーバーコードです:

public void run(){
    try{
        System.out.println("Starting writing file");
        objOut.writeObject("File");
        objOut.flush();

        File f= new File(filePath);
        String name= f.getName();
        int length =(int) f.length();
        objOut.writeObject(name);
        objOut.flush();

        objOut.writeObject(length);
        objOut.flush();

        byte[] filebytes = new byte[(int)f.length()];
        FileInputStream fin= new FileInputStream(f);
        BufferedInputStream bin = new BufferedInputStream(fin);

        bin.read(filebytes, 0, filebytes.length);
        BufferedOutputStream bout = new BufferedOutputStream(objOut);
        bout = new BufferedOutputStream(objOut);
        bout.write(filebytes, 0, filebytes.length);
        bout.flush();      
        System.out.println("File completelty sent");

    }
    catch(Exception ex)
    {
        System.out.println("error on writing file : "+ex.getMessage());
    }

}

以下はクライアントコードです:

 while(true){
            fobjIn = new ObjectInputStream(fileSock.getInputStream());
            String str = (String) fobjIn.readObject();
            if(str.equals("File"))
            {
                System.out.println("Starting receiving file");
                ReceiveFile();
            }
            System.out.println(str);
        }

 public void ReceiveFile() throws Exception{

     String name =(String)fobjIn.readObject();
   File f = new File("C:/Temp/" +name);
   f.createNewFile();
   int length = (int) fobjIn.readObject();
   FileOutputStream fout = new FileOutputStream(f);
   BufferedOutputStream buffout = new BufferedOutputStream(fout);
   byte[] filebyte = new byte[length];
   int bytesRead=0,current=0;
   bytesRead = fobjIn.read(filebyte, 0, filebyte.length);
    do {
        bytesRead = fobjIn.read(filebyte, current, (filebyte.length-current));
        if(bytesRead > 0) {
            current += bytesRead;
            System.out.println("writting" + bytesRead);
        }
        else break;
     } while(bytesRead > -1);

^^^^^^^物乞いをしている間はループから出てきません^^^^^^^^

    buffout.write(filebyte, 0 , current);
    buffout.flush();
    System.out.println("written");

}
4

1 に答える 1

2

サーバーが送信を完了したことをクライアントに通知できるように、送信が完了したら、おそらくサーバー側でストリームを閉じる必要があります。そうしないと、さらにデータが来るのを待っているだけです。

于 2013-01-28T14:10:41.417 に答える