2011-08-05 21 views
0

私はネットワーク上の任意の種類のファイルをJavaで転送するためのネットワークファイル転送システムを作っています。その大きさはいかなる種類のものであってもよい。したがって、私はタスクのためにUTF-8プロトコルを使用しました。Javaでソケットを介したファイル転送

私が作成したコードを提供していますが、ファイルがそのまま転送されることがありますが、何の問題もありません。しかし、実際にはmp3/video/imageファイルが正しく開かれるように制限するデータのほんの数kbは受信側でスキップされることがあります。問題はBUFFERだと思う。私はバッファを作成していない、今、私はいくつかの私の役に立つかもしれないと思う。

誰かが問題に関する助けをしてファイルが完全に転送されるようになったら本当に感謝します。

クライアント側:--- >>ファイルの送信者

Socket clientsocket = new Socket(host,6789);      // host contains the ip address of the remote server 
DataOutputStream outtoserver = new DataOutputStream(clientsocket.getOutputStream()); 
try 
{ 
    int r=0; 
    FileInputStream fromFile1 = new FileInputStream(path);     // "path" is the of the file being sent. 
    while(r!=-1) 
    { 
     r = fromFile1.read(); 
     outtoserver.writeUTF(r+""); 
    } 
} 
catch(Exception e) 
{ 
    System.out.println(e.toString()); 
} 
clientsocket.close(); 

サーバー側:--- >>ファイルレシーバー

ServerSocket welcome = new ServerSocket(6789); 
Socket conn = welcome.accept(); 
try 
{ 
    String r1 = new String(); 
    int r=0; 
    FileOutputStream toFile1 = new FileOutputStream(path);     // "path" is the of the file being received. 
    BufferedOutputStream toFile= new BufferedOutputStream(toFile1); 
    DataInputStream recv = new DataInputStream(conn.getInputStream()); 
    while(r!=-1) 
    { 
     r1 = recv.readUTF(); 
     r = Integer.parseInt(r1); 
     toFile.write(r); 
    } 
} 
catch(Exception e) 
{ 
    System.out.println(e.toString()); 
} 
+1

ファイルを扱う場合、なぜエンコーディングが気になるのですか?バイトを書きます。 –

答えて

5

あなたは、なぜ私は理解していませんバイナリデータをテキストとしてエンコードします。

プレーンソケットは、問題なくバイトストリームを送受信できます。したがって、ファイルをFileInputStreamを使用してバイトとして読み取って、そのバイトをそのままソケットに書き込みます。

(レコードの場合、入力ファイルの1バイトごとに3〜5バイトを送信している可能性があります。また、入力ファイルをバッファリングせずに1バイト読み込んでいます。ファイルの転送速度に大きな影響を持っている可能性がありました。パフォーマンスを取得する方法は、単純に、少なくとも1Kバイトのバッファサイズを使用してバイトの配列を読み書きすることである。)


私はわかりませんしかし、私はあなたがいくつかのデータを失っている理由は、送信側のソケットを閉じる前に、あなたがフラッシュしていないか、outtoserverを閉じることではないかと思われます。

FOLLOW UP

私はまた、あなたが受信側にtoFileを閉じる/フラッシュしていないことに気付き、それはあなたがファイルの末尾にデータを失うことにつながる可能性があります。

+0

+1:それは驚くほど遅くなければなりません。 "File sender"はバッファリングも使用しません。 –

+0

yopuは、この点を具体的に説明するために、「ファイルをFileInputStreamを使ってバイトとして読み取って、そのままソケットに書き込んでください」というように注意してください。ありがとう。 –

+0

http://docs.oracle.com/javase/tutorial/essential/io/bytestreams.htmlおよびhttp://docs.oracleからレッスンを組み合わせてください。com/javase/tutorial/networking/sockets/readingWriting.html –

1

私が見る最初の問題は、DataInputStreamDataOutputStreamを使用していることです。これらはプリミティブJavaタイプ(int,longなど)の読み書き用です。バイナリデータの場合には必要ありません。

もう1つの問題は、ファイル出力ストリームをフラッシュしていないことです。これは、失われたバイトを引き起こす可能性があります。

0

明示的なフラッシュが状況を助けるかもしれません。

関連する問題