Indy

Тема в разделе "Delphi - Сети", создана пользователем konstin, 24 апр 2015.

  1. konstin

    konstin New Member

    Регистрация:
    24 апр 2015
    Сообщения:
    2
    Симпатии:
    0
    Добрый вечер, тема не новая, но после прочтения кучи форумов в голове настоящая каша. Необходимо осуществить передачу файла от клиента к серверу, после чего сервер его просто сохраняет.
    Пробывал по разному и остановился на:
    клиент
    1. передаем имя файла
    2. передаем размер в байтах
    3. читает файл в поток;
    4. отсылаем поток на сервер

    begin
    if main.client.Socket.Connected = true then
    begin
    main.client.Socket.WriteLn('-send file'); // команда
    main.client.Socket.WriteLn(ExtractFileName(sOpenDialog1.FileName)); // имя
    main.client.Socket.WriteLn(inttostr(GetFileSize(sOpenDialog1.FileName)));
    // размер
    fs := TfileStream.Create(sOpenDialog1.FileName, fmOpenRead );
    main.client.Socket.WriteBufferOpen;
    main.client.Socket.write(fs);
    main.client.Socket.WriteBufferFlush;
    main.client.Socket.WriteBufferClose;
    end;
    fs.Free;
    end;

    сервер:
    1. Ждем команды от постоянно подключенного клиента, если пришло '-send file' то начинаем принимать файл
    2. читаем в рекорд имя
    3. читаем в рекорд размер в байтах
    4. созздаем файловый поток
    5. читаем в этот поток данные

    begin
    com := AContext.Connection.Socket.ReadLn;
    if AnsiContainsStr(com, '-send file') then
    begin
    main.log(com);
    fi.name := AContext.Connection.Socket.ReadLn;
    main.log(fi.name);
    fi.size := AContext.Connection.Socket.ReadLn;
    main.log(fi.size);
    try
    fs := TFileStream.Create(fi.name, fmCreate or fmShareDenyRead);
    AContext.Connection.IOHandler.ReadStream(fs);
    //
    fs.f
    finally
    fs.Free;
    end;
    end;
    end;

    Файл вроде как и создается но... всегда фиксированного размера... видимо стандартный размер буфера - 1,25 гб. При этом если резко ракрыть клиент то файл принимает свой размер, но чаще всего поврежден. Если кидать допустим исошку в 4 гб то он естественно выводит что памяти нехватает... но как разбить поток на части или вобщем его передать придумать не могу. На клиенте пробывал копировать поток в поток и так его отправлять но сервер все равно видит его как единое целое
     
  2. -master-

    -master- Well-Known Member

    Регистрация:
    14 янв 2012
    Сообщения:
    629
    Симпатии:
    18
    при чем тут инди?
     
  3. konstin

    konstin New Member

    Регистрация:
    24 апр 2015
    Сообщения:
    2
    Симпатии:
    0
    эм.. Использую эти компоненты =), вообще с дэльфи и паскалем знаком на уровне лаб... если не так понял вопрос прошу прощения)
     
Загрузка...
Похожие Темы - Indy
  1. erhe
    Ответов:
    7
    Просмотров:
    2.723
  2. slavon-x86
    Ответов:
    3
    Просмотров:
    11.758

Поделиться этой страницей