«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как правильно передавать файлы через сокеты в Java?

Как правильно передавать файлы через сокеты в Java?

Опубликовано 17 ноября 2024 г.
Просматривать:586

How to Correctly Transfer Files Over Sockets in Java?

Передача файлов Java через сокеты: отправка и получение байтовых массивов

В Java передача файлов через сокеты включает преобразование файла в массивы байтов, отправка их через сокет, а затем преобразование байтов обратно в файл на принимающей стороне. В этой статье рассматривается проблема, с которой столкнулся разработчик Java при реализации этой функции передачи файлов.

Проблема на стороне сервера

Похоже, что серверный код создает пустой файл при получении данные от клиента. Чтобы решить эту проблему, сервер должен использовать цикл для чтения данных, отправленных клиентом, по частям, используя буфер для временного хранения данных. Как только все данные будут получены, сервер может записать полный файл. Исправленный код сервера выглядит следующим образом:

byte[] buffer = new byte[1024];
int bytesRead = 0;
while ((bytesRead = in.read(buffer)) != -1) {
    fos.write(buffer, 0, bytesRead);
}

Проблема на стороне клиента

Клиентский код первоначально отправляет на сервер пустой массив байтов. Чтобы отправить фактическое содержимое файла, следует использовать следующий код:

FileInputStream is = new FileInputStream(file);
byte[] bytes = new byte[(int) length];
is.read(bytes);
out.write(bytes);

Улучшенный код

С учетом вышеупомянутых исправлений полный код для сервера и клиента выглядит следующим образом:

Сервер:

...
byte[] buffer = new byte[1024];
DataOutputStream out = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
DataInputStream in = new DataInputStream(new BufferedInputStream(socket.getInputStream()));

FileOutputStream fos = new FileOutputStream("C:\\test2.xml");
int bytesRead = 0;
while ((bytesRead = in.read(buffer)) != -1) {
    fos.write(buffer, 0, bytesRead);
}
fos.close();
...

Клиент:

...
Socket socket = new Socket(host, 4444);
DataOutputStream out = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
DataInputStream in = new DataInputStream(new BufferedInputStream(socket.getInputStream()));

File file = new File("C:\\test.xml");
FileInputStream is = new FileInputStream(file);
long length = file.length();
if (length > Integer.MAX_VALUE) {
    System.out.println("File is too large.");
}
byte[] bytes = new byte[(int) length];
is.read(bytes);
out.write(bytes);
...
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3