Я хочу отправить несколько файлов с подключением к сокету. Для одного файла он отлично работает, но если я пытаюсь отправить более одного (по одному за раз) я получаю сокет исключение:отправить несколько файлов с помощью JAVA-сокета
java.net.SocketException: socket closed
В общем мое соединение работает следующим образом:
- сервера ждет подключения
- Клиент подключается к серверу и посылает запрос на определенный файл (строка, которая содержит имя файла)
- сервер считывает локальный файл и отправляет его клиенту
- Client посылает другой запрос на другой файл и продолжается в точке 3.
вводный Метод «ожидания-для-запроса» -процедура выглядит следующим образом:
@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(). К сожалению, метод также закрывает соединение сокета (проблема для дальнейших подключений). Но если я оставлю это закрытие, передача файлов не будет работать корректно: файлы становятся неполными на клиенте.
Как я могу избежать или исправить эту проблему? Или есть даже лучший способ передать несколько запрошенных файлов?
Спасибо
Необходимо сообщить своему клиенту, насколько велики файлы. В противном случае вы просто потоки байтов без конца. Клиент не будет знать, когда прекратить чтение. Подумайте о связи между двумя (протокол). –