Envoyer le texte “http” au cours de python socket
Je suis en train de créer un serveur HTTP à l'aide de python. Le truc c'est que je suis tout fonctionne, sauf pour l'envoi d'un message de réponse; si le message est un texte http
, le send()
ne fonctionne pas.
Voici l'extrait du code:
connectionSocket.send('HTTP/1.1 200 OK text/html')
Voici les autres que j'ai essayé:
connectionSocket.send(''.join('%s 200 OK text/html' % ('HTTP/1.1')))
connectionSocket.send('%s 200 OK text/html' % ('HTTP/1.1'))
msg = 'HTTP/1.1 200 OK text/html'
for i in range(0, len(msg))
connectionSocket.send(msg[i])
La seule chose qui semble fonctionner est l'entité flying l'un des personnage dans HTTP
, comme
connectionSocket.send('HTTP/1.1 200 OK text/html')
Où H
est équivalent à H
. Sinon, le navigateur ne peut pas afficher l'en-tête reçu de l'python serveur de socket.
Le problème va aussi lorsque j'essaie d'envoyer un 404 Message
en bas de la douille. Les autres contenus sont affichés, cependant, comme un fichier html envoyé par le support.
Je veux savoir est-il une bonne façon de le faire? Car, si le client n'est pas un navigateur, l'entité html ne sera pas comprise.
Merci d'avance
Mise à jour:
Code:
from socket import *
serverSocket = socket(AF_INET, SOCK_STREAM)
serverSocket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
serverSocket.bind(('127.0.0.1', 1240))
serverSocket.listen(1);
while True:
print 'Ready to serve...'
connectionSocket, addr = serverSocket.accept()
try:
message = connectionSocket.recv(1024)
filename = message.split()[1]
f = open(filename[1:])
outputdata = f.read()
#Send one HTTP header line into socket
connectionSocket.send('HTTP/1.1 200 OK text/html') ## this is not working
#Send the content of the requested file to the client
for i in range(0, len(outputdata)):
connectionSocket.send(outputdata[i])
connectionSocket.close()
except IOError:
connectionSocket.send('HTTP/1.1 404 File not found') ## this is not working
connectionSocket.close();
serverSocket.close()
Captures d'écran:
Texte comme 'HTTP/1.1 ...'
Texte comme 'HTTP/1.1 ...'
Code HTML de hello.html
<html>
<head>
<title>Test Python</title>
</head>
<body>
<h1>Hello World!</h1>
</body>
</html>
http
est la source du problème que le socket n'est pas en mesure d'envoyer.C'est ce que j'ai d'abord pensé, mais, les autres éléments sont affichés correctement. Le code envoie le code html de lecture de données à partir du fichier et le navigateur affiche correctement, tous à l'exception de l'en-tête http.
Mais le navigateur n'est pas supposer pour afficher l'en-tête http n'est-ce pas?
Veuillez fournir suffisamment d'informations pour reproduire le problème. Dites-nous qui bibliothèques, etc. vous êtes en utilisant.
Le HTTP valide est dépouillé par le navigateur, c'est la façon dont le navigateur communique avec le serveur. Si vous voyez le rendu html, alors il est probablement de travail
OriginalL'auteur Gopikrishna S | 2014-02-27
Vous devez vous connecter pour publier un commentaire.
Vous n'êtes pas de retour correctement formé de réponse HTTP. Votre ligne
n'est même pas terminée par une nouvelle ligne, puis immédiatement suivi par le contenu de votre fichier. Des protocoles comme HTTP spécifier assez rigoureusement ce qui doit être envoyé, et je trouve ça presque du miracle que vous avez vu quoi que ce soit dans votre navigateur.
Essayez quelque chose comme:
C'est le début d'un correctement formé de réponse HTTP 1.1 avec une première ligne de réponse et une seule tête. Le double retour à la ligne se termine en-têtes, de préparer le client à lire le contenu qui suit.
http://www.jmarshall.com/easy/http/ est l'un des nombreux accessible façons d'en apprendre un peu plus sur le protocole que vous avez choisi d'utiliser. Bonne chance!
connectionSocket.send('HTTP/1.1\n\n 200 OK Content-Type: text/html');
et il affiche tout de 200 à text/html. Toutefois, elle ne s'affiche pas HTTP/1.1, que vous les gars a dit, il est supprimé.Le
"\n\n"
de la cessation de la réponse HTTP au début. Jetez un oeil à tcpipguide.com/free/t_HTTPResponseMessageFormat.htm pour découvrir ce que vous devriez être à l'envoi - il est très important de respecter le format correct ici, vous ne pouvez pas simplement faire comme vous allez le long, et un peu de lecture vous permettra d'économiser beaucoup de temps.OriginalL'auteur holdenweb
Je ne suis pas sûr de ce que
connectionSocket
que vous utilisez (qui module, bibliothèque, etc.) mais si cette chose est déjà partie d'un HTTP liés à la routine, il se pourrait bien qu'il envoie le nécessaireHTTP
ligne sans que vous ayez fait. La vôtre pourrait perturber le processus.Le prix de la version (
HTTP
...) n'est probablement pas reconnu par le protocole HTTP dans le navigateur (je pense que la citation est seulement reconnus et interprétés dans les couches hautes du modèle OSI) et ne peut donc pas avoir le même effet.socket
.from socket import *
. Et pouvez-vous être plus clair s'il vous plaît, je ne peux pas comprendre si vous êtes disant que le format est correct ou pas. "Le prix de la version (HTTP...) n'est probablement pas reconnu par le protocole HTTP dans le navigateur" -- le prix de la version est ce qui fonctionne. D'autres ne.connection_socket
est le socket retourné par uneaccept()
appel dans le code. Ce n'est pas la question.Oui, mon idée était faux, évidemment, si vous utilisez
socket.socket
directement. J'ai pensé donner laHTTP
explicitement en plus d'un impliciteHTTP
le présumé bibliothèque sous-jacente produit automatiquement (ce qui n'est évidemment pas le cas avecsocket.socket
) conduirait à un doublement et donc à un problème. Donner ensuite dans une cité formulaire explicitement aurait quitté la partie implicite intacte et donc masqué le problème. Vous n'avez pas le dire tout de suite, mais maintenant je pense que sans la cité de la version (c'est à dire sans une version non cotées), il ne fonctionnera pas non plus. Suis-je le droit?OriginalL'auteur Alfe