0

ソケットを介して2台のコンピューター間でファイルを転送する作業をしています。すべてが機能しているように見えますが、取得したファイルの内容を見ると、空です。私は何が間違っているのですか?

これが私のサーバー側のコードです。ファイルfoobar.txtが存在し、その内容は「helloworld!」です。

try{ 
    ServerSocket ssock = new ServerSocket(12345);
    Socket sock = ssock.accept();
    //here I get the filename from the client, but that works fine.
    File myFile = new File("foobar.txt");
    byte[] mybytearray = new byte[(int) myFile.length()];
    BufferedInputStream bis = new BufferedInputStream(new FileInputStream(myFile));
    bis.read(mybytearray, 0, mybytearray.length);
    OutputStream os = sock.getOutputStream();
    os.write(mybytearray, 0, mybytearray.length);
    os.flush();
    sock.close();
} catch (Exception e){
    e.printStackTrace();
}

そして、これが私のクライアントコードです:

try {
    Socket socket = new Socket(host, port);
    PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
    out.print("get foobar.txt\r\n");
    out.flush();
    byte[] streamIn = new byte[1024];
    InputStream in = socket.getInputStream();
    FileOutputStream file_src = new FileOutputStream("foobar.txt"); 
    BufferedOutputStream file_writer = new BufferedOutputStream(file_src);
    int i;
    while ((i = in.read()) != -1) {
        file_writer.write(i);
    }
    file_writer.flush();
    file_writer.close();
    file_src.close();
    socket.close();
} catch (Exception e) {
   e.printStackTrace();
}

解決しました

複数のスレッドと複数のソケットを使用し、1台のマシンですべての接続をテストしているため、クライアント(クライアントとサーバーの両方のコードが含まれている)が他のクライアントではなく自分自身に接続するという問題が発生しました。実行中のさまざまなクライアントのファイル転送ポートを変更すると、これがすべて機能します。これを見て、私にいくつかの提案をしてくれたすべての人に感謝します。

4

3 に答える 3

1

クライアントの間違ったソケットを閉じている可能性があります。ソケットを閉じるthis.socketと、ローカル変数の代わりにクラスフィールドが閉じられますsocket

BufferedOutputStreamまた、ファイルへの出力ストリームを閉じるときに、との両方を閉じる必要はありませんFileOutputStream。が閉じられると、FileOutputStreamは自動的に閉じBufferedOutputStreamられます。

もう1つ---出力ストリームを閉じる前にフラッシュする必要はありません。呼び出すとclose()、ストリームは自動的にフラッシュされます。

于 2011-11-24T17:09:44.680 に答える
0

私が思う唯一のことは、サーバー側がコマンド("get foobar.txt")を読み取らないため、実際にはファイルの受信を開始しないため、クライアント側はコマンドの送信時にフリーズするということです。

クライアント側にファイルが存在するのは、以前のテストによるものである可能性があります。

しかし、これが問題かどうかはわかりません。それはただ助けようとする試みです。

于 2011-11-24T17:27:56.063 に答える
0

他のみんなが言ったことに加えて、あなたはbis.read()の結果を無視しています。バッファがいっぱいになることは保証されていません。Javadocを参照してください。

Javaでストリームをコピーする正しい方法は、両端で使用する必要があります。これは次のとおりです。

byte[] buffer = new byte[8192]; // or whatever
int count;
while ((count = in.read(buffer)) > 0)
{
  out.write(buffer, 0, count);
}
于 2011-11-24T21:23:09.547 に答える