Перед тем как перейти к решению проблемы, стоит отметить, что для успешной передачи файла между устройствами, необходимо, чтобы формат передачи данных на стороне отправителя соответствовал формату, который ожидает получатель. В данном случае, код на Java для отправки файла с Android устройства не включает в себя передачу информации о файле, которую ожидает код на Delphi для приёма файла.
Проблема
Код на Java для отправки файла не передаёт информацию о файле, такую как TFileInfo, которую ожидает Delphi-приложение. Также при чтении данных, содержащих многобайтовые целые числа, важно учитывать порядок байт.
Шаг 1: Предварительная обработка данных на стороне Android
На стороне Android необходимо изменить код таким образом, чтобы перед отправкой файла был передан объект TFileInfo. Пример кода на Java для этого может выглядеть следующим образом:
Socket sock;
try {
sock = new Socket("172.16.3.120", 1025);
System.out.println("Connecting...");
// Подготовка TFileInfo
File myFile = new File(Environment.getExternalStorageDirectory().getPath() + "/UchTeh/uchteh.db");
TFileInfo fileInfo = new TFileInfo(); // Создание соответствующего класса TFileInfo
fileInfo.FileName = myFile.getName();
fileInfo.FileLength = myFile.length();
// Преобразование структуры в байты
byte[] fileInfoBytes = new byte[SizeOf(TFileInfo)];
// Заполнение байтов структурой, учитывая порядок байт
// ...
// Отправка TFileInfo
OutputStream os = sock.getOutputStream();
os.write(fileInfoBytes, 0, fileInfoBytes.length);
os.flush();
// sendfile
byte[] mybytearray = new byte[(int) myFile.length()];
// Код чтения файла и отправки данных, как в исходном примере
// ...
os.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Шаг 2: Обработка данных на стороне Delphi
На стороне Delphi необходимо изменить код для чтения TFileInfo перед чтением данных файла. Важно также учитывать порядок байт при преобразовании многобайтовых чисел. Пример кода на Object Pascal для этого:
procedure TServerRcvThread.ClientExecute;
var
SockStream : TWinSocketStream;
FileInfo : TFileInfo;
FileStream : TFileStream;
RcvBuf : array[0..140] of Byte;
nRead : Integer;
nToRead : Integer;
nTotal : Integer;
begin
FStatus := 'Unknown error';
SockStream := TWinSocketStream.Create(ClientSocket, 10000);
try
if SockStream.WaitForData(10000) then begin
nRead := SockStream.Read(FileInfo, SizeOf(TFileInfo));
if (nRead = SizeOf(TFileInfo)) then begin
// Обработка порядка байт, если это необходимо
// ...
nTotal := 0;
FileStream := TFileStream.Create(FDir + '\' + FileInfo.FileName, fmCreate);
try
while (nTotal < FileInfo.FileLength) do begin
// Код чтения и записи файла, как в исходном примере
// ...
end;
finally
FileStream.Free;
end;
if (nTotal = FileInfo.FileLength) then
FStatus := 'File ' + FileInfo.FileName + ' received (' + IntToStr(nTotal) + ' bytes)'
else
FStatus := 'File ' + FileInfo.FileName + ' error (' + IntToStr(nTotal) + ' bytes)';
end
else
FStatus := 'File info header error';
end
else begin
FStatus := 'Client delay error';
ClientSocket.Close;
Terminate;
end;
finally
SockStream.Free;
Synchronize(SetStatus);
end;
end;
Заключение
Убедитесь, что данные, отправляемые с Android, соответствуют ожиданиям Delphi-приложения. Обратите внимание на порядок байт при работе с многобайтовыми числами. При необходимости, используйте соответствующие функции для преобразования порядка байт.
Объяснение проблемы обмена файлами между Android и компьютером с использованием сокетов и Delphi состоит в необходимости синхронизации данных об отправляемом файле и корректной обработке порядка байт при передаче многобайтовых чисел.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.