4

私はこの単純なサーバー/クライアントアプリケーションを持っています。サーバーにOutputStream(FileOutputStream、OutputStream、ObjectOutputStreamなど)を介してファイルを送信させ、実際のファイルに保存する前にクライアント側で受信させようとしています。問題は、これを試してみましたが、失敗し続けることです。ファイルを作成してサーバーから受け取ったオブジェクトをファイルに書き込むと、壊れた画像が表示されます(jpgとして保存するだけですが、それは問題ではありません)。誤動作している可能性が最も高いコードの部分は次のとおりです(ここに表示されている、一見宣言されていないオブジェクトはすべて、事前に宣言されています)。

サーバ:

                ObjectOutputStream outToClient = new ObjectOutputStream(
                        connSocket.getOutputStream());
                File imgFile = new File(dir + children[0]);
                outToClient.writeObject(imgFile);
                outToClient.flush();

クライアント:

ObjectInputStream inFromServer = new ObjectInputStream(
                clientSocket.getInputStream());
        ObjectOutputStream saveImage = new ObjectOutputStream(
                new FileOutputStream("D:/ServerMapCopy/gday.jpg"));
        saveImage.writeObject(inFromServer.readObject());

したがって、私の問題は、壊れたファイルを取得せずに、ストリームを介してオブジェクトを正しく取得できないことです。

4

2 に答える 2

11

Fileオブジェクトは、実際のコンテンツではなく、そのファイルへのパスを表します。あなたがすべきことはbyte、そのファイルからsを読み取り、それらをあなたのに送信することですObjectOutputStream

File f = ...
ObjectOutputStream oos = ...

byte[] content = Files.readAllBytes(f.toPath);
oos.writeObject(content);


File f=...
ObjectInputStream ois = ...

byte[] content = (byte[]) ois.readObject();
Files.write(f.toPath(), content);
于 2012-07-21T16:08:30.367 に答える
1

実際にファイルを転送するのではなく、JavaからFileインスタンスを転送します。Fileオブジェクトは、ファイルの(サーバー)ローカルハンドルと考えてください。ただし、その内容とは考えないでください。画像を転送するには、実際に最初にサーバーで画像を読み取る必要があります。

ただし、とにかくクライアントにバイトを保存するだけの場合は、そもそもObjectOutputStreamを忘れることができます。ファイルに保存されているバイトを転送するだけです。まず、FileChannelクラスとそのtransferToメソッドおよびtransferFromメソッドを見てください。

于 2012-07-21T16:11:50.080 に答える