0

さて私はJavaのソケットを使用してファイルを転送しようとしています

これがコードです

クライアントコード

try{
    // get streams
    DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
    DataInputStream  din = new DataInputStream (socket.getInputStream());
    dos.writeUTF(fileName);
    dos.flush();

    boolean isOk = din.readBoolean();
    if(!isOk){
        throw new StocFileNotFound("Fisierul: " + fileName +" was not found on:" + address.toString());
    } else {
        baos = new ByteArrayOutputStream();
        byte biti [] = new byte[1024];

        while(din.read(biti,0,1024) != -1){
            baos.write(biti,0,biti.length);
        }
    }

}
catch(IOException e){}
finally {
    try{ socket.close(); } catch (IOException  e){}
}

次に、を返し、baos.toByteArray()OutputStreamのwriteメソッドを使用してファイルに書き込みます。

サーバーコード

try{
    DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
    DataInputStream  din = new DataInputStream (socket.getInputStream());

    // check if it is really a file or if it is an existing file
    File file = new File(din.readUTF());

    // write false
    if ( !file.exists() || !file.isFile() ){
        dos.writeBoolean(false);
        dos.flush();
    }

    // write true and write the file
    else {
        byte biti[] = new byte[1024];
        dos.writeBoolean(true);

        FileInputStream fis = new FileInputStream(file);

        while(fis.read(biti,0,1024) != -1){
            dos.write(biti,0,biti.length);
        }

        dos.flush();

        try{ fis.close(); } catch (IOException e){}

    }

} catch (IOException e){}
finally {
    try{socket.close();}catch(IOException e){}
}

問題

.txtファイルを転送して表示するとgedit、テキストの後に複数のが表示されますが、ファイルを\00\00\00使用して開くとnotepad(in wine)、テキストのみが表示されます。.doc加えて、画像や作品もご覧いただけます。それで、geditそれは私のプログラムで何かありますか、それともそれですか?

編集私は「こんにちは、うまくいくことを願っています!」のようなものを送っていました。

4

2 に答える 2

2

これが問題(または少なくとも問題)です:

while(fis.read(biti,0,1024) != -1)
{
    dos.write(biti,0,biti.length);
}

常にバッファ全体を書き出していますが、実際には多くのバイトが読み取られました。あなたが持っている必要があります:

int bytesRead;
while ((bytesRead = fis.read(biti, 0, 1024)) != -1)
{
    dos.write(biti, 0, bytesRead);
}

(コードの両方のビットで同じ問題が発生します。)

この種のコードを何度も何度も書くという面倒な作業(およびエラーの可能性)を軽減するために、さまざまなユーティリティメソッドを備えたGuavaを確認することをお勧めします。

于 2012-11-18T12:29:13.273 に答える
0

readメソッドは、ストリームから読み取られた実際のバイト数を返します。これをwriteメソッドのパラメーターとして使用する必要があります。そうしないと、ガベージが書き込まれます。

于 2012-11-18T12:33:32.607 に答える