2010-07-30 6 views
2

J'ai besoin de programmer un serveur sans état pour exécuter des méthodes distantes. Le client utilise REST avec un paramètre JSON pour transmettre le nom de la méthode et ses paramètres. Après l'entretien du résultat, la session est fermée. Je dois utiliser Indy10, TCP/IP comme protocole, et donc utiliser IdHTTPServer.Retour d'information dans une session HTTP sans état

De grands ensembles de résultats sont tronqués par Indy10 et envoyés au client par parties.

Mon problème est maintenant:

Les méthodes sur le serveur fournissent des informations de progression si elles prennent plus de temps pour produire les résultats. Ce sont des messages courts. Comment puis-je écrire au client?

Jusqu'ici j'ai utilisé writeflush sur le serveur, mais le client a attendu que la demande se termine avant de rendre le résultat complet, y compris les informations de progression. Que puis-je faire pour afficher/traiter ces informations de progression sur le client tout en gardant la connexion ouverte pour recevoir d'autres données sur la même requête?

Répondre

1

Sur le côté client, au lieu du composant client HTTP standard TIdHTTP, vous pouvez utiliser la classe Indy TIdTCPClientCustom dans l'unité IdTCPClient pour envoyer la demande et traiter la réponse.

Cette classe donne un contrôle total sur le traitement des réponses du serveur. J'ai utilisé la classe TIdTelnet comme point de départ pour implémenter un client pour un protocole de messagerie de courtier de messages, et l'ai trouvé stable et fiable pour les données textuelles et binaires.

Dans le thread de réception, les données entrantes peuvent être lues jusqu'à des délimiteurs et analysées en blocs (pour les informations de progression) et traitées immédiatement.

+0

J'ai besoin d'utiliser TIdHTTPServer, car j'implémente REST (un GET avec des paramètres de TIdHTTP). J'aimerais utiliser quelque chose comme writebufferflush, mais je n'arrive pas à le faire fonctionner - je reçois toujours le premier writeln dans un messagebox, et le reste est rejeté. –

+0

Voir ma modification, ma suggestion est d'utiliser TIdTCPClientCustom du côté client au lieu de TIdHTTP, pour avoir un contrôle total sur le traitement de la réponse du serveur – mjn

Questions connexes