Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Решение проблемы передачи файла между Android и компьютером с использованием сокетов и Delphi

Delphi , Интернет и Сети , Сокеты

Перед тем как перейти к решению проблемы, стоит отметить, что для успешной передачи файла между устройствами, необходимо, чтобы формат передачи данных на стороне отправителя соответствовал формату, который ожидает получатель. В данном случае, код на 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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Сокеты ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 07:55:33/0.0049090385437012/1