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

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
Vano
Сообщения: 41
Зарегистрирован: 16 авг 2004, 22:21
Откуда: Днепропетровск
Контактная информация:

Я использую компоненты TServerSocket, TClientSocket. Пытаюсь переслать файл от клиента к серверу. Если файл большой, то он пересылается "порциями" байт. Мне необходимо знать закончил ли клиент передачу данных. Как можно это узнать?
Аватара пользователя
AiK
Сообщения: 2287
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

Вообще говоря способа два.
Первый, общепринятый, это когда клиент перед отправкой контента серверу сообщает общее количество байт, передаваемых в massage body, и, если речь идёт о chunk'ах - размер очередного куска в байтах. Т.е. ты постоянно сверяешь два числа - весь ли очередной кусок получен, и если весь, то не всё ли тело сообщения уже получено.
Подвариант - клиент в конце message body отправляет некую кодовую комбинацию, получение которой автоматически означает завершение передачи.
Ну и второй вариант - клиент по окончании передачи закрывает коннекцию.
Даже самый дурацкий замысел можно воплотить мастерски
Vano
Сообщения: 41
Зарегистрирован: 16 авг 2004, 22:21
Откуда: Днепропетровск
Контактная информация:

Если я пишу так, то клиент не успевает передать всю информацию до выполнения ClientSocket1.Close.

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

   ClientSocket1.Socket.SendStream(TFileStream.Create(pathfile,
      fmOpenRead or fmShareDenyWrite));
  ClientSocket1.Close;
Как тогда быть??
И ещё одна проблема. Если я открываю клиента в той же процедуре из которой передаю данные, то первый SendStream выполняется, а последующие нет. Они выполняются только после второго входа в эту процедуру. А если же открыть клиента не в этой процедре, то всё нормально. Чё так?
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

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