Страница 1 из 1

Как узнать закончил ли клиент передачу данных?

Добавлено: 04 ноя 2004, 20:52
Vano
Я использую компоненты TServerSocket, TClientSocket. Пытаюсь переслать файл от клиента к серверу. Если файл большой, то он пересылается "порциями" байт. Мне необходимо знать закончил ли клиент передачу данных. Как можно это узнать?

Добавлено: 05 ноя 2004, 02:13
AiK
Вообще говоря способа два.
Первый, общепринятый, это когда клиент перед отправкой контента серверу сообщает общее количество байт, передаваемых в massage body, и, если речь идёт о chunk'ах - размер очередного куска в байтах. Т.е. ты постоянно сверяешь два числа - весь ли очередной кусок получен, и если весь, то не всё ли тело сообщения уже получено.
Подвариант - клиент в конце message body отправляет некую кодовую комбинацию, получение которой автоматически означает завершение передачи.
Ну и второй вариант - клиент по окончании передачи закрывает коннекцию.

Добавлено: 05 ноя 2004, 11:30
Vano
Если я пишу так, то клиент не успевает передать всю информацию до выполнения ClientSocket1.Close.

Код: Выделить всё

   ClientSocket1.Socket.SendStream(TFileStream.Create(pathfile,
      fmOpenRead or fmShareDenyWrite));
  ClientSocket1.Close;
Как тогда быть??
И ещё одна проблема. Если я открываю клиента в той же процедуре из которой передаю данные, то первый SendStream выполняется, а последующие нет. Они выполняются только после второго входа в эту процедуру. А если же открыть клиента не в этой процедре, то всё нормально. Чё так?

Добавлено: 09 ноя 2004, 08:06
Naeel Maqsudov
Если я пишу так, то клиент не успевает передать всю информацию до выполнения ClientSocket1.Close.
Мне кажется, что передать-то он успевает, но на серверной стороне событие OnCloseConnection происходит раньше, чем сервер успевает обработать данные из буфера.