我正在尝试使用python创建HTTP服务器。问题是除了发送响应消息之外,我正在努力工作;如果邮件包含文字http
,则send()
无效。
以下是代码片段:
connectionSocket.send('HTTP/1.1 200 OK text/html')
以下是我试过的其他人:
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])
唯一可行的方法是实体化HTTP
中的任何一个角色,比如
connectionSocket.send('HTTP/1.1 200 OK text/html')
H
等同于H
。否则浏览器不会显示从python服务器套接字收到的标头。
当我尝试向套接字发送404 Message
时,问题也出现了。但是,显示其他内容,就像通过套接字发送的html文件一样。
我想知道有没有正确的方法呢?因为,如果客户端不是浏览器,则不会理解html实体。
提前致谢
更新
代码:
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()
截图:
文字为'HTTP / 1.1 ...'
文字为'HTTP / 1.1 ...'
hello.html的HTML代码
<html>
<head>
<title>Test Python</title>
</head>
<body>
<h1>Hello World!</h1>
</body>
</html>
答案 0 :(得分:10)
您没有返回正确形成的HTTP响应。你的行
connectionSocket.send('HTTP/1.1 200 OK text/html') ## this is not working
甚至没有被换行符终止,然后紧接着是你文件的内容。像HTTP这样的协议非常严格地规定了必须发送的内容,我发现你在浏览器中看到任何东西都是奇迹般的。
尝试类似:
connectionSocket.send('HTTP/1.1 200 OK\nContent-Type: text/html\n\n')
这是具有主响应行和单个标头的正确形成的HTTP 1.1响应的开始。双换行符终止标题,使客户端准备读取后面的内容。
http://www.jmarshall.com/easy/http/是了解您选择使用的协议的许多平易近人的方法之一。祝你好运!
答案 1 :(得分:0)
我不确定您使用的是什么connectionSocket
(哪个模块,库等)但是如果这个东西已经是HTTP相关例程的一部分,那很可能它已经发送了必要的没有你做的HTTP
行。那么你可能会打扰这个过程。
引用的版本(HTTP
...)可能无法被浏览器中的HTTP协议识别(我认为引用只能在OSI堆栈的更高层中识别和解释),因此没有同样的效果。