2011-08-14 11 views
1

このcodeでは、ファイルが最初に送信された場合(送信しているファイルの数に関係なく)、コードは正常に動作します。しかし、FileSenderをループに入れてファイルを1つずつ送信すると、最初の転送後に受信者側で受け取ったデータは任意です(デバッグ中にチェックされていると)、ファイルも受信されません。ここで私がやった変更があり、それは機能していません。ソケットファイル転送

FileSender.java

import java.io.OutputStream; 
import java.io.File; 
import java.net.Socket; 
public class FileSender { 
public void main(Socket socket,String[] args) { 
try { 

    OutputStream os  = socket.getOutputStream(); 
    int cnt_files = args.length; 

    // How many files? 
    ByteStream.toStream(os, cnt_files); 

    for (int cur_file=0; cur_file<cnt_files; cur_file++) { 
    ByteStream.toStream(os, new File(args[cur_file]).getName()); 
    ByteStream.toStream(os, new File(args[cur_file])); 
    } 
} 
catch (Exception ex) { 
    ex.printStackTrace(); 
} 
} 
} 

文字列[]引数は、送信するファイルのパスを含みます。

FileReceiver.java

import java.io.File; 
import java.io.InputStream; 
import java.net.Socket; 

public class FileReceiver { 

public void main(Socket socket,String arg) { 
try { 
    InputStream in = socket.getInputStream(); 

    int nof_files = ByteStream.toInt(in); 
System.out.println("reach 1  "+ nof_files); 
    for (int cur_file=0;cur_file < nof_files; cur_file++) { 
    String file_name = ByteStream.toString(in); 

    File file=new File(arg+file_name); 
    System.out.println("Received path is : "+file); 
    ByteStream.toFile(in, file); 
    } 

} 
catch (java.lang.Exception ex) { 
    ex.printStackTrace(System.out); 
} 
} 

} 

argは、ファイルが格納される時にパスが含まれています。

メインの機能は、私がファイルを転送したいときはいつでも言いたいと思います。基本的に私はディレクトリを含むことができる複数のファイルを転送したい。これを行うために私は次のコードを書いた。

ServerFile.java

import java.io.*; 
import java.net.*; 
public class ClientFile implements Runnable{ 
Socket clientsocket; 
public void run() { 
    try 
    { 
     clientsocket = new Socket("219.64.189.14",6789); 
    // Some code 
    copy(outtoserver,infromserver, files);  // files contains the path of files to be transferred. 
    // Some code 
     clientsocket.close(); 
    } 
    catch(Exception e2) 
    { 
      System.out.println("ClientFile "+String.valueOf(e2) + "\n"); 
    } 
} 
public void copy(DataOutputStream outtoserver,BufferedReader infromserver,String[] files) 
{ 
    try 
    { 
     FileSender fs = new FileSender(); 
     int totalfiles=0; 
     int r=0; 
     File oldfile; 
     outtoserver.write(files.length); 
     String chk; 
     while(totalfiles<files.length) 
     { 

      oldfile = new File(files[totalfiles]); 
      if(oldfile.isDirectory()) 
      { 
       outtoserver.writeBytes("folder\n"); 
       File folder1[] = oldfile.listFiles(); 
       String[] folder = new String[folder1.length]; 
       int count=0; 
       for(File name : folder1) 
       { 
        folder[count] = name + ""; 
        System.out.println(folder[count]); 
        count++; 
       } 
       outtoserver.writeBytes(oldfile.getName()+"\n"); 
       fs.main(clientsocket, folder); 

      } 
      else if(oldfile.isFile()) 
      { 
       outtoserver.writeBytes("file\n"); 
     chk = infromserver.readLine(); 
       if(chk.equals("send")) 
       { 
        outtoserver.writeBytes(oldfile.getName()+"\n"); 
        String[] folder = new String[]{oldfile.getAbsolutePath()}; 
        fs.main(clientsocket, folder); 
       } 
       totalfiles++; 
       outtoserver.flush(); 

      } 
     } 
    } 
    catch(Exception e) 
    { 
     System.out.println("ClientFile -->> "+e.toString()); 
    } 
} 
} 

ClientFile.java

import java.io.*; 
import java.net.*; 
import javax.swing.*; 
class ServerFile implements Runnable { 
Socket conn; 
public ServerFile(Socket a) 
{ 
    conn = a; 
} 
public void run() { 
    File file1; 
    String clientsen=""; 
    try 
    { // Some code 
     copy(outtoclient,infromclient,file1.getAbsolutePath());  //file1 is the directory to which the file has to stored.  
    // some code 
    }  
    catch(Exception e0) 
    { 
     System.out.println("ServerFile "+String.valueOf(e0)+"\n"+e0.getCause()); 
    } 
}//end main 
public void copy(DataOutputStream outtoclient,BufferedReader infromclient,String basepath) 
{ 
    try 
    { 
     FileReceiver fr = new FileReceiver(); 
     int totfiles = infromclient.read(); 
     int tot=0; 
     File file; 
     String path = null,chk; 
     while(tot<totfiles) 
     { 
      chk = infromclient.readLine(); 
      if(chk.equals("file")) 
      { 
       outtoclient.writeBytes("send\n"); 
       path = infromclient.readLine(); 
       path = basepath+File.separator+path; 
       file=new File(path); 
       fr.main(conn, basepath+File.separator); 
      } 
      else if(chk.equals("folder")) 
      { 
       String name = infromclient.readLine(); 
       name = basepath+File.separator+name; 
       new File(name).mkdir(); 
       fr.main(conn, name+File.separator); 
      } 
      tot++; 
     } 
    } 
    catch(Exception e) 
    { 
     System.out.println("Server file: "+e.toString()); 
    } 
} 

}//end class 

私が間違っている場合は、すべての手段によって、私を修正します。

助けてください。

+0

'ServerFile.java'と' ClientFile.java'てもコンパイルされません。 'run()'メソッドは、他のメソッド( 'outtoserver'、' infromserver'、 'files'、' outtoclient'、 'infromclient')の変数を参照します。コンパイルしている_actual_コードは何ですか? –

答えて

-1

だから、ファイル名とファイル名をどのように区切っているのか分かりません。おそらくファイル名と内容を含む直列化可能なクラスを作成するほうがいいでしょう。この場合、ObjectInput/OutputStreamを使用できます。それ以外の場合は、ファイルの内容/ファイル名の区切りを定義し、Scannerクラスを使用して入力ストリームからファイルを区切る必要があります。

+0

ファイル名は、常にファイルの内容の直前に送信されます。これは次のようになります: '[ファイル名の長さ(4バイト整数)] [ファイル名バイト] [ファイルの内容バイトの長さ(4バイトの整数)] [ファイルの内容バイト]'。 'Serializable'クラスは、この特定のシナリオのために過剰なもののように聞こえます。 –

+0

@アダム:あなたはどんな方法で助けてくれますか? – pankaj

+0

@Audrey:申し訳ありませんが、私は 'FileSender'と' FileReceiver'を見ていました。他のクラスは違って見えます。 –

1

"file\n"または"folder\n"のいずれかをクライアントに送信します。これらの文字列を読み取るには、BufferedReaderを使用しています。そのクラスの名前に細心の注意を払う:BufferedReaderBufferedReaderreadLine()を呼び出すと、少なくともの行を読み取るために必要な数だけ、をバッファします(読み取ります)。これは、おそらくよりもを、その行を読み取るために必要な正確なバイト数よりも読むことができます。たとえば、BufferedReaderのバッファサイズが256であるとしますが、ライン("\n"を含む)には8バイトしか必要ないとします。これは、バッファされた残りの248バイトがFileReceiverによって読み取られないことを意味します。それは4バイトの整数を期待しているので完全に混乱しますが、実際には他のものを読んでいます。

この例で既に使用されている手法を利用することをお勧めします。

ByteStream.toStream(os, "file") 

を使用してそしてそれを読む:たとえば、使用して"file"を送信

ByteStream.toString(in) 
+0

しかし、どのように最初のファイルが完全に送信されて来て... ??? – pankaj