Delphi и TIdTCPServer.OnExecute: как правильно объединить данные - PullRequest
4 голосов
/ 27 марта 2012

Очень простой вопрос, на который я не могу найти однозначного ответа.

У меня классический сервер TCP Indy. Я отправляю данные кусками. Каждый пакет данных отправляется в 1 или более порций. Когда он прибывает, OnExecute запускается один или несколько раз для каждого пакета. Более одного клиента может отправлять данные в любой момент времени. Как узнать, для какого клиента / пакета я получаю данные в OnExecute? Я знаю, что это тривиальный вопрос, но я хочу получить окончательный ответ.

1 Ответ

3 голосов
/ 27 марта 2012

Если вы можете спроектировать протокол, это можно сделать так:

  • клиент начинает с начальной команды, которая включает в себя общий размер и размер чанка
  • на сервере OnExecuteсоздает временный выходной файловый поток и сохраняет информацию о файле в контексте
  • , клиент отправляет чанки
  • , сервер OnExecute читает чанки (используя Indy TCP-сервер, блокирующий методы чтения с известной длиной чанка) идобавляет их в выходной поток

Класс контекста Indy TCP можно расширить, добавив пользовательскую информацию для клиентского соединения.

...