所以我在过去几天里一直在使用套接字,并尝试制作一个基本程序来传输文件。文件确实传输,但它们不完整。就像,当我尝试发送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();
感谢您提供任何帮助:)
答案 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);
}