我试图将文件发送到我的服务器。我得到它使用小于100mb的文件。否则我跑出了堆。所以我重新制作了它,但却无法让它发挥作用。除了读取我在bis.read(缓冲区)中遇到的最后数据之外,我还得上班,因为它不知道文件何时结束。所以我尝试发送每个段的长度,以便bufferedInputStream知道何时停止读取。
知道什么是错的吗?
发件人代码:
FileInputStream fis = new FileInputStream(file);
byte[] buffer = new byte[2048];
Integer bytesRead = 0;
BufferedOutputStream bos = new BufferedOutputStream(clientSocket.getOutputStream());
BufferedInputStream bis = new BufferedInputStream(fis);
while ((bytesRead = bis.read(buffer)) > 0) {
objectOutStream.writeObject(bytesRead);
bos.write(buffer, 0, bytesRead);
}
System.out.println("Sucess sending file");
接收方(服务器):
fileName = request.getFileName();
int size = (int) request.getSize();
BufferedInputStream bis = new BufferedInputStream(clientSocket.getInputStream());
FileOutputStream fos = new FileOutputStream(fileName);
int totalBytesReceived = 0;
int blockSize = 0;
while (totalBytesReceived < size) {
Object o = ois.readObject();
if (!(o instanceof Integer)) {
System.out.println("Something is wrong");
}
blockSize = (Integer) o;
buffer = new byte[blockSize];
bis.read(buffer);
totalBytesReceived += blockSize;
fos.write(buffer, 0, blockSize);
}
System.out.println("File succes");
答案 0 :(得分:3)
服务器端的阅读代码应与客户端的阅读代码相同。
// copy from bis to bos, using a buffer.
for(int len; (len = bis.read(buffer)) > 0) {
bos.write(buffer, 0, len);
}
在客户端你想要
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(filename));
BufferedOutputStream bos = new BufferedOutputStream(clientSocket.getOutputStream());
在服务器端你想要的。
BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filename));
完成后你想要
bos.close();
bis.close();
如果你打算使用ObjectOutputStream(我建议你不要),你只需要使用这个流,而不是流的混合。
答案 1 :(得分:0)
您可以简化代码。当您到达流的末尾时,您将从bis.read()
获得-1。这样你就不需要知道文件的长度。并flush()
和close()
服务器和客户端上的流。正如另一张海报所说,不要使用ObjectOutputStream
或ObjectIntputStream
。您将获得序列化标头,这些标头似乎会损坏您的数据。
fileName = request.getFileName();
BufferedInputStream bis = new BufferedInputStream(clientSocket.getInputStream());
FileOutputStream fos = new FileOutputStream(fileName);
int data = bis.read(); //reads an int
while (data != -1) {
fos.write(data);
data = bis.read();
}
fos.flush();
fos.close();
System.out.println("File succes");