Java文件传输 - 不完整的文件

时间:2014-04-05 14:53:26

标签: java sockets filestream file-transfer

所以我在过去几天里一直在使用套接字,并尝试制作一个基本程序来传输文件。文件确实传输,但它们不完整。就像,当我尝试发送500kB文件时,接收器只能获得480kB的文件。我搜索了很长一段时间,但我找不到错误。我发现了一些类似的错误,流没有关闭,但我的,但它仍然没有正确发送。

发信人:

//Main
//...
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream(), true);
//...

public void sendFile(File file)
{
    try {           
        buffer = new byte[(int) file.length()];
        DataInputStream filestream = new DataInputStream(new FileInputStream(file));
        filestream.readFully(buffer);

        DataOutputStream outStream = new DataOutputStream(socket.getOutputStream());

        send("FILE_"+file.length()+"_\t"+file.getName());

        outStream.write(buffer);
        outStream.flush();

        filestream.close();

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } 
}

public void send(String data) {
    out.println(data);
}

接收者:

DataInputStream inStream = new DataInputStream(client.getInputStream());

File file = new File("temp"+"\\"+expectedFile);
file.createNewFile();

BufferedOutputStream fileOut = new BufferedOutputStream(new FileOutputStream(file, false));

buffer = new byte[1024];

while (size > 0 && (receivedBytes = inStream.read(buffer, 0, (int)Math.min(buffer.length, size))) != -1)     
{     
    fileOut.write(buffer, 0, receivedBytes);
    fileOut.flush();     
    size -= receivedBytes;     
}  

fileOut.close(); 

感谢您提供任何帮助:)

2 个答案:

答案 0 :(得分:3)

您在此行中放弃了第一次读取数据:

int receivedBytes = inStream.read(buffer, 0, buffer.length);

不确定那行代码是什么(旧调试?)。你基本上只需要删除它。

更新:

您似乎表示您要在流的开头发送其他元数据。我的猜测是,在读取初始元数据时,您正在使用某种BufferedInputStream / Reader,这是吞下后续文件数据的一部分。

您可以通过将DataInputStream包装在用于读取元数据的BufferedInputStream周围来解决此问题。但是,您必须要小心,无论您使用什么来读取元数据,都不会读取比应该更多的数据。这样做比你想象的要复杂得多。您可能希望专门使用DataInput / Output流(使用writeUTF / readUTF来处理文件名,使用writeLong / readLong来处理文件大小)。

答案 1 :(得分:0)

接收端一般应该看起来像这样...

socket = serverSocket.accept();
socket is = socket.getInputStream();

FileOutputStream fos = new FileOutputStream("fileName");
BufferedOutputStream bos = new BufferedOutputStream(fos);

int count;
while ((count = is.read(bytes)) > 0) {
        bos.write(bytes, 0, count);
    }