0

我在java中使用套接字进行文件传输。这是客户端代码

for(int i = 0;i < fileList.size();i++) {
    String filename = (String)fileList.get(i);
    RequestFile(filename);

    try {
        BufferedOutputStream fileWriter = new BufferedOutputStream(
                                              new FileOutputStream(
                                                  new File(PROGRAM_PATH + "/" + 
                                                           filename)));         
        int packet;
        int count = 0;

        while((packet = fileReader.read()) != -1) {
            fileWriter.write(packet);
            count++;
        }

        System.out.println(filename + " receiver complete. (count : " + count + ")");
        fileWriter.flush();
        fileWriter.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

这是服务器代码

public void SendFile(String filename) {
    try {
        fileReader = new BufferedInputStream(new FileInputStream(CLIENT_PATH + "/" + filename));

        int packet;
        int count = 0;
        while((packet = fileReader.read()) != -1) {
            count++;
            fileWriter.write(packet);
        }
        fileWriter.write(-1);
        System.out.println(count);

        fileReader.close();
    }
    catch (IOException ioe) {
        ioe.printStackTrace();
    }
}

当我检查服务器的计数时,它是635. 这意味着服务器已发送数据635时间。但是,客户端的打印计数仅为512. (从 0 到 511)我认为它停在read(),因为

System.out.println(filename + " receiver complete. (count : " + count + ")");

不打印。谁能告诉我原因和解决方法?

4

1 回答 1

0

在服务器端,您不能向-1客户端发送带值的字节。这一行:

fileWriter.write(-1);

它不会做你想做的事。该write()方法将采用参数的最低 8 位并将其作为一个字节发送(在本例中为0xff)。在客户端,fileReader.read()它将作为0xff(类型int)而不是-1(类型int)接收。

-1是一个特殊值,指示已到达流的末尾。它不是要写入或读取的有效数据。如果您发送-1,客户端会将其读取为0xff=255. 可以发送和接收的值0..255都包含在内。同样,-1是流结束的特殊值。

在服务器端,您不会刷新或关闭输出流。这可能解释了差异(缓冲区中的数据可能无法传递给客户端)。

于 2014-10-27T12:13:40.093 回答