通过单个套接字连接发送多个文件时 java 中的 EOF 异常
EOF Exception in java while sending multiple files through single socket connection
我正在尝试通过 java 套接字发送多个文件。成功接收到第一个文件后,抛出 EOFexception。我无法弄清楚出了什么问题。 (所有文件都从发送方成功发送)
发件人代码:
sendToServer = new Socket(receiver,port);
DataOutputStream out = new DataOutputStream(sendToServer.getOutputStream());
for(File f: file_to_send){
sendMessage = f.getName() + "\n"+ f.length() + "\n";
out.writeUTF(sendMessage);
FileInputStream requestedfile = new FileInputStream(f.getPath());
System.out.println("file path: "+f.getPath());
int count;
byte[] buffer = new byte[8192];
while ((count = requestedfile.read(buffer)) > 0)
{
out.write(buffer, 0, count);
}
System.out.println("File transfer completed!! voila! :)");
requestedfile.close();
}
out.close();
sendToServer.close();
收件人代码:
System.out.println("File Count : " + fileCount);
for (int count =0; count<fileCount; count++){
String fileName = dis.readUTF();
int length = Integer.parseInt(fileName.split("\n")[1]);
fileName = fileName.split("\n")[0];
System.out.println("File Name : " + fileName);
System.out.println("Length : " + length);
System.out.println("File Data : ");
FileOutputStream fos = new FileOutputStream(new File(fileName));
int c;
byte[] buffer = new byte[8192];
while ((c = dis.read(buffer)) > 0)
{
fos.write(buffer, 0, c);
fos.flush();
}
fos.close();
System.out.println("\nFile received successfully!!! voila !! :)");
}
输出是这样的:
Files Count : 2
File Name : Belly Dance.3gp
Length : 15969978
File Data :
File received successfully!!! voila !! :)
java.io.EOFException
at java.base/java.io.DataInputStream.readUnsignedShort(DataInputStream.java:345)
at java.base/java.io.DataInputStream.readUTF(DataInputStream.java:594)
at java.base/java.io.DataInputStream.readUTF(DataInputStream.java:569)
at App.java.DiscoveryClient.HandleInputMessage(DiscoveryClient.java:130)
at App.java.DiscoveryClient.run(DiscoveryClient.java:44)
at java.base/java.lang.Thread.run(Thread.java:834)
接收文件的代码在读取第一个文件后不会停止,而是继续读取直到流结束,将发送的所有内容写入同一个文件。
您需要跟踪已经读取了多少字节and/or您还需要读取多少字节:
int remainingBytes = length;
while (remainingBytes > 0 && (c = dis.read(buffer, 0, Math.min(buffer.length, remainingBytes))) > 0)
{
remainingBytes -= c;
fos.write(buffer, 0, c);
// fos.flush(); this is not really necessary
}
顺便说一下,使用 int
作为文件长度限制您的文件最大为 2GB。如果这是一个问题,请使用 long
而不是 int
。
我正在尝试通过 java 套接字发送多个文件。成功接收到第一个文件后,抛出 EOFexception。我无法弄清楚出了什么问题。 (所有文件都从发送方成功发送)
发件人代码:
sendToServer = new Socket(receiver,port);
DataOutputStream out = new DataOutputStream(sendToServer.getOutputStream());
for(File f: file_to_send){
sendMessage = f.getName() + "\n"+ f.length() + "\n";
out.writeUTF(sendMessage);
FileInputStream requestedfile = new FileInputStream(f.getPath());
System.out.println("file path: "+f.getPath());
int count;
byte[] buffer = new byte[8192];
while ((count = requestedfile.read(buffer)) > 0)
{
out.write(buffer, 0, count);
}
System.out.println("File transfer completed!! voila! :)");
requestedfile.close();
}
out.close();
sendToServer.close();
收件人代码:
System.out.println("File Count : " + fileCount);
for (int count =0; count<fileCount; count++){
String fileName = dis.readUTF();
int length = Integer.parseInt(fileName.split("\n")[1]);
fileName = fileName.split("\n")[0];
System.out.println("File Name : " + fileName);
System.out.println("Length : " + length);
System.out.println("File Data : ");
FileOutputStream fos = new FileOutputStream(new File(fileName));
int c;
byte[] buffer = new byte[8192];
while ((c = dis.read(buffer)) > 0)
{
fos.write(buffer, 0, c);
fos.flush();
}
fos.close();
System.out.println("\nFile received successfully!!! voila !! :)");
}
输出是这样的:
Files Count : 2
File Name : Belly Dance.3gp
Length : 15969978
File Data :
File received successfully!!! voila !! :)
java.io.EOFException
at java.base/java.io.DataInputStream.readUnsignedShort(DataInputStream.java:345)
at java.base/java.io.DataInputStream.readUTF(DataInputStream.java:594)
at java.base/java.io.DataInputStream.readUTF(DataInputStream.java:569)
at App.java.DiscoveryClient.HandleInputMessage(DiscoveryClient.java:130)
at App.java.DiscoveryClient.run(DiscoveryClient.java:44)
at java.base/java.lang.Thread.run(Thread.java:834)
接收文件的代码在读取第一个文件后不会停止,而是继续读取直到流结束,将发送的所有内容写入同一个文件。
您需要跟踪已经读取了多少字节and/or您还需要读取多少字节:
int remainingBytes = length;
while (remainingBytes > 0 && (c = dis.read(buffer, 0, Math.min(buffer.length, remainingBytes))) > 0)
{
remainingBytes -= c;
fos.write(buffer, 0, c);
// fos.flush(); this is not really necessary
}
顺便说一下,使用 int
作为文件长度限制您的文件最大为 2GB。如果这是一个问题,请使用 long
而不是 int
。