0

2 つの Java ソケット クライアント間のファイル転送メカニズムを構築しようとしています。送信側クライアントには、次のようなスニペットが含まれます。

    FileInputStream fis = null;
    BufferedInputStream bis = null;
    BufferedOutputStream outStream = null;
    byte[] fileBytes = new byte[(int) file.length()];
    int bytesRead = 0;

    try {
        fis = new FileInputStream(file);
        bis = new BufferedInputStream(fis);
        outStream = new BufferedOutputStream(socket.getOutputStream());
        bytesRead = bis.read(fileBytes, 0, fileBytes.length);
        outStream.write(fileBytes, 0, fileBytes.length);

    } catch (IOException _IOExc) {
        Logger.getLogger(ChatClient.class.getName()).log(Level.SEVERE, 
            null, _IOExc);
        //QuitConnection(QUIT_TYPE_DEFAULT);
    } 

サーバーメディエーターは次のようになります。

public void run() {
    assert (outSocket != null);
    byte[] bytes = new byte[fileSize];
    try {
        System.out.println("inStream " + inStream.available());
        outStream = new BufferedOutputStream(outSocket.getOutputStream());
        inStream.read(bytes, 0, fileSize);
        outStream.write(bytes, 0, fileSize);
        outStream.flush();

    } catch (IOException ex) {
        Logger.getLogger(FileTransport.class.getName()).log(Level.SEVERE, 
            null, ex);
    }
  }

宛先クライアント:

    public void run() {
        try {
            System.out.println("Start reading...");
            int len = 1024;
            BufferedInputStream inStream = new BufferedInputStream 
                  (client.user.getClientSocket().getInputStream());
            while ((bytesRead = inStream.read(fileBytes, 0, len)) > 
                  0 && current < fileSize) {
                current = current + bytesRead;
                System.out.println("current "+ current);
                bos.write(fileBytes, 0, bytesRead < len ? bytesRead : len);
            }
            bos.flush();
            bos.close();
        } catch (IOException ex) {
            Logger.getLogger(ReadFileThread.class.getName()).log(Level.SEVERE, 
                null, ex);
        } catch (InterruptedException e) {
        }
    }

サーバーと宛先クライアントの両方に事前に「fileSize」が渡されます。問題は、サーバー側のデータがわずかに少なくなり、clientB がサーバーから 8192 バイトのデータしか読み取らず、ループから抜け出せないことです。

どうもありがとうケブ

4

1 に答える 1

1

read()メソッドの結果を無視しないでください。読み取られたバイト数を返しますが、これは必ずしもファイルの長さではありません。read()-1 を返すまで、常にループで呼び出す必要があります。

そして、絶対に使用しないでくださいavailable()。返されると思ったものは返されません。read()-1 が返されるまで、または読み取りバイト数が予想される数に達するまでループします。

IO チュートリアルを読んでください。

于 2012-11-30T20:23:43.807 に答える