java文件接收停止

java文件接收停止,java,file-transfer,bufferedinputstream,bufferedoutputstream,Java,File Transfer,Bufferedinputstream,Bufferedoutputstream,我在java中使用套接字进行文件传输。 这是客户端代码 当我检查服务器的计数时,是635。这意味着服务器已经发送了635次数据。 但是,客户端的打印计数只有512。从0到511我想它在read停止了,因为 没有打印。有人能告诉我原因和解决方案吗?在服务器端,不能向客户端发送值为-1的字节。这一行: fileWriter.write(-1); 它做不到你想要的。write方法将获取参数的最低8位,并将其作为一个字节发送,在本例中为0xff。在客户端,fileReader.read将作为int类型

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

当我检查服务器的计数时,是635。这意味着服务器已经发送了635次数据。 但是,客户端的打印计数只有512。从0到511我想它在read停止了,因为


没有打印。有人能告诉我原因和解决方案吗?

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

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

-1是一个特殊值,表示已到达流的末尾。它不是要写入或读取的有效数据。如果发送-1,客户端将读取为0xff=255。可以发送和接收的值为0..255(包括0..255)。同样,-1是流末尾的特殊值

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

我认为您应该使用数据包来增加计数,并检查是否所有字节都被传输。
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();
    }
}
System.out.println(filename + " receiver complete. (count : " + count + ")");
fileWriter.write(-1);