我想发送多个带套接字连接的文件。对于一个文件它完美地工作,但如果我尝试发送多个(一次一个)我得到一个Socket异常:
java.net.SocketException: socket closed
一般来说,我的连接是这样的:
“waiting-for-request”程序的run-Method看起来像这样:
@Override
public void run() {
String message;
try {
while ((message = reader.readLine()) != null) {
if (message.equals(REQUESTKEY)) {
System.out.println("read files from directory and send back");
sendStringToClient(createCodedDirContent(getFilesInDir(new File(DIR))),socket);
} else if (message.startsWith(FILE_PREFIX)) {
String filename = message.substring(FILE_PREFIX.length());
try {
sendFile(new File(DIR+filename));
} catch(IOException e) {
System.err.println("Error: Could not send File");
e.printStackTrace();
}
} else {
System.out.println("Key unknown!");
}
}
} catch(Exception ex) {
ex.printStackTrace();
}
和我的sendFile()方法如下所示:
public void sendFile(File file) throws IOException {
FileInputStream input = new FileInputStream(file);
OutputStream socketOut = socket.getOutputStream();
System.out.println(file.getAbsolutePath());
int read = 0;
while ((read = input.read()) != -1) {
socketOut.write(read);
}
socketOut.flush();
System.out.println("File successfully sent!");
input.close();
socketOut.close();
}
我认为问题在于socketOut.close()。不幸的是,该方法也关闭了套接字连接(进一步连接的问题)。但是,如果我忽略了这个结束,文件传输不正确:文件在客户端到达不完整。
如何避免或解决此问题?或者甚至有更好的方法来传输多个请求的文件?
谢谢
答案 0 :(得分:1)
我稍微重写了您的发送文件方法,以便您可以发送多个文件,您需要将DataOutputStream
传递给它并在发送完所有要发送的文件后关闭流。
阅读时,您应使用DataInputStream
并调用long len = dis.getLong()
,然后从流中读取len
个字节,然后重复下一个文件。您可能会发现在开始时发送文件数很有用。
public void sendFile(File file, DataOutputStream dos) throws IOException {
if(dos!=null&&file.exists()&&file.isFile())
{
FileInputStream input = new FileInputStream(file);
dos.writeLong(file.getLength());
System.out.println(file.getAbsolutePath());
int read = 0;
while ((read = input.read()) != -1)
dos.writeByte(read);
dos.flush();
input.close();
System.out.println("File successfully sent!");
}
}
答案 1 :(得分:0)
您可以在客户端和服务器之间定义简单协议。在文件内容之前发送文件长度。使用DataOutputStream / DataInputStream发送/读取长度。不要在每个文件后关闭套接字。