Как узнать закончил ли клиент передачу данных?
Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду
-
- Сообщения: 41
- Зарегистрирован: 16 авг 2004, 22:21
- Откуда: Днепропетровск
- Контактная информация:
Я использую компоненты TServerSocket, TClientSocket. Пытаюсь переслать файл от клиента к серверу. Если файл большой, то он пересылается "порциями" байт. Мне необходимо знать закончил ли клиент передачу данных. Как можно это узнать?
Вообще говоря способа два.
Первый, общепринятый, это когда клиент перед отправкой контента серверу сообщает общее количество байт, передаваемых в massage body, и, если речь идёт о chunk'ах - размер очередного куска в байтах. Т.е. ты постоянно сверяешь два числа - весь ли очередной кусок получен, и если весь, то не всё ли тело сообщения уже получено.
Подвариант - клиент в конце message body отправляет некую кодовую комбинацию, получение которой автоматически означает завершение передачи.
Ну и второй вариант - клиент по окончании передачи закрывает коннекцию.
Первый, общепринятый, это когда клиент перед отправкой контента серверу сообщает общее количество байт, передаваемых в massage body, и, если речь идёт о chunk'ах - размер очередного куска в байтах. Т.е. ты постоянно сверяешь два числа - весь ли очередной кусок получен, и если весь, то не всё ли тело сообщения уже получено.
Подвариант - клиент в конце message body отправляет некую кодовую комбинацию, получение которой автоматически означает завершение передачи.
Ну и второй вариант - клиент по окончании передачи закрывает коннекцию.
Даже самый дурацкий замысел можно воплотить мастерски
-
- Сообщения: 41
- Зарегистрирован: 16 авг 2004, 22:21
- Откуда: Днепропетровск
- Контактная информация:
Если я пишу так, то клиент не успевает передать всю информацию до выполнения ClientSocket1.Close.
Как тогда быть??
И ещё одна проблема. Если я открываю клиента в той же процедуре из которой передаю данные, то первый SendStream выполняется, а последующие нет. Они выполняются только после второго входа в эту процедуру. А если же открыть клиента не в этой процедре, то всё нормально. Чё так?
Код: Выделить всё
ClientSocket1.Socket.SendStream(TFileStream.Create(pathfile,
fmOpenRead or fmShareDenyWrite));
ClientSocket1.Close;
И ещё одна проблема. Если я открываю клиента в той же процедуре из которой передаю данные, то первый SendStream выполняется, а последующие нет. Они выполняются только после второго входа в эту процедуру. А если же открыть клиента не в этой процедре, то всё нормально. Чё так?
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
Мне кажется, что передать-то он успевает, но на серверной стороне событие OnCloseConnection происходит раньше, чем сервер успевает обработать данные из буфера.Если я пишу так, то клиент не успевает передать всю информацию до выполнения ClientSocket1.Close.