-1

ソケット経由でファイルの内容を転送しようとしています。このコードは 90% の確率で正常に実行されますが、失敗することもあります。

この接続は、ファイルの転送だけでなく、サーバーとクライアント間の DataInputStream/DataOutputStream ベースの通信にも使用されます。

問題は、バイトがストリームにスタックしているように見えることです。送信したファイルは壊れており、次に何か (整数など) を転送すると、サーバーはクライアントが送信したものとはまったく異なるものを受け取ります。

配列のサイズを決定するために、以前に DataOutputStream.writeInt() を介してファイルのサイズを送信していることに注意してください。これはうまくいくようです。

これは、クライアント側でファイルを送信するためのコードです。以前、FileInputStream を介してファイルを byte[] 配列に読み取っていました。

public static void writeToStream(byte[] binary, OutputStream out) throws IOException
{
    int offset = 0, left = binary.length, read;
    while(left > 0)
    {
        if(left > 1024) read = 1024;
        else read = left;
        out.write(binary, offset, read);
        offset += read;
        left -= read;
    }
    out.flush();
}

サーバー側では、このコードはバイトをストリームから配列にコピーし、ファイルに書き込みます。

public static void readToArray(byte[] binary, InputStream in) throws IOException
{
    int left = binary.length, offset = 0, read, toread;
    while(left > 0)
    {
        if(left > 1024) toread = 1024;
        else toread = left;
        read = in.read(binary, offset, toread);
        left -= read;
        offset += read;
    }
}

ここであなたの助けに本当に感謝します!

4

1 に答える 1

1

あなたが書いたナンセンスは必要ありません。必要なのは、メソッド自体を基本的に冗長にするwriteToStream().ことだけです。out.write(binary),同様に、あなたの方法は、独自のバグが追加されたreadToArray()単なる模倣です。DataInputStream.readFully()捨てて使ってください。

于 2013-09-12T11:05:10.900 に答える