У меня три вопроса:
можно ли уничтожить IdTCPServer по множеству подключений? Я попытался протестировать свое приложение, и когда у меня есть несколько подключений - оно работает очень хорошо (даже несколько дней), но когда иногда количество подключений увеличивается, приложение дает нарушение доступа. Я написал приложение, которое имитирует 50 клиентов, постоянно отправляющих данные (только со сном (200)). И в этой ситуации IdTCPServer дает исключения? Мое приложение получает информацию от клиентов по событию onExecute и изменяет таблицу баз данных с помощью классов TidNotify и TIdSync. Я считаю, что он защищает перекрестные соединения потоков? Отправку информации клиентам делает TTimer (это только сейчас, поменяю на другой поток). Достаточно ли использовать в этой ситуации специальную защиту или что-то в этом роде:
type PClient = ^TClient; TClient = record Activity_time:TDateTime; AContext: TIdContext; end; ... list := server.Contexts.LockList; try for i := 0 to list.Count - 1 do with TIdContext(list[i]) do begin if SecondsBetween(now(), PClient(data)^.activity_time) > 6 then begin Connection.IOHandler.Close; Continue; end; try Connection.IOHandler.writeln('E:'); Except Connection.IOHandler.Close; end; end; finally server.Contexts.UnlockList; end;
2. Есть ли простой способ отказаться от соединения, когда сервер занят (я думаю, что моя база данных не сложна (100 строк, только одна строка модифицируется одним соединением), но, может быть, это способ сохранить стабильность сервера?
3. Я знаю, что этот вопрос повторялся много раз, но я не нашел удовлетворительного ответа: как защитить приложение, чтобы избежать исключения сообщений: «Соединение закрыто корректно» и «Соединение сброшено узлом»?
Спасибо за все советы
OnExecute
работает НЕ так. Он запускается в непрерывном цикле на время существования соединения. Как толькоOnExecute
выходит, он тут же снова срабатывает, вне зависимости есть новые данные или нет. Код внутри обработчикаOnExecute
отвечает за фактическое ожидание новых данных по мере необходимости. Вот где тайм-ауты вступают в игру. Вы можете выполнить ожидание данных по времени и проверить тайм-аут простоя в том же коде. Я обновил пример в своем ответе, чтобы продемонстрировать это. 03.01.2013