Comment un client http associer une réponse HTTP avec une demande (avec Netty) ou en général?

StackOverflow https://stackoverflow.com/questions/7306497

  •  25-10-2019
  •  | 
  •  

Question

est un point final http suppose de répondre aux demandes d'un client particulier afin de leur réception?

Qu'en est-il si elle n'a pas de sens dans le cas de demandes traitées par groupe derrière un proxy ou demandes traitées avec NIO où une demande est terminée plus vite que l'autre?

Y at-il un moyen standard d'associer un identifiant unique à chaque requête HTTP à associer à la réponse? Comment est-ce traité dans les clients comme http httpclient ou onduler un composant graphique?

La question se résume à l'affaire suivante:

On suppose, que je télécharge un fichier à partir d'un serveur et la demande n'est pas fini. Est un client capable de remplir d'autres demandes sur la même connexion keep-alive?

Était-ce utile?

La solution

Je ne vais pas réécrire la réponse de CodeCaster parce qu'il est très bien rédigé.

En réponse à votre édition - pas. Ce n'est pas. Une connexion HTTP persistante unique ne peut être utilisé pour une demande à la fois, ou il obtiendrait très déroutant. Parce que HTTP ne définit pas toute forme de mécanisme de suivi demande / réponse, il ne serait tout simplement pas possible.

Il convient de noter qu'il existe d'autres protocoles qui utilisent un format de message similaire (conforme à la RFC822 ), qui ne prévoient (en utilisant des mécanismes tels que en-tête de CSeq SIP ), et il serait possible de mettre en œuvre ce dans une application HTTP personnalisé, mais HTTP ne définit aucun mécanisme standard pour ce faire, et donc on ne peut rien faire qui puisse supposer au travail partout. Il présenterait également un problème avec la réponse du second message - attendez-vous pour la première réponse à la fin avant d'envoyer la deuxième réponse, ou essayer de mettre en pause la première réponse lorsque vous envoyez la deuxième réponse? Comment allez-vous communiquer d'une manière que les messages de garanties ne deviendront pas corrompu?

Notez également que SIP (en général) fonctionne sur UDP, qui ne commande pas de paquets de garantie, ce qui rend le système CSeq plus d'une nécessité.

Si vous voulez envoyer une demande à un serveur alors qu'une autre transaction est en cours, vous aurez besoin de créer une nouvelle connexion au serveur, et donc un nouveau flux TCP.

Facebook a fait des recherches sur ce alors qu'ils étaient en train de construire leur CDN, et ils ont conclu que vous pouvez efficacement avoir 2 ou 3 flux HTTP ouverts à un moment donné, mais plus que cela réduit le temps de transfert global en raison du paquet supplémentaire frais généraux Coût. Je lien vers l'entrée de blog si je pouvais trouver le lien ...

Autres conseils

Chaque fois qu'une connexion TCP est ouverte, la connexion est reconnue par les ports source et de destination et les adresses IP. Donc, si je me connecte à www.google.com sur le port de destination 80 (par défaut pour HTTP), je besoin d'un port source libre qui le système d'exploitation va générer.

La réponse du serveur Web est ensuite envoyé au port source (et IP). Ceci est également la façon dont fonctionne la NAT, qui remémoration port source auquel appartient l'adresse IP interne (et vice-versa pour les connexions entrantes).

En ce qui concerne votre édition: non, une seule connexion http peut exécuter une commande (GET / POST / etc) en même temps. Si vous envoyez une autre commande pendant que vous retreiving données à partir d'une commande précédente, les résultats peuvent varier selon le client et la mise en œuvre du serveur. Je suppose que Apache, par exemple, transmettra le résultat de la deuxième demande après est envoyé les données de la première demande.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top