简单的Python Web服务器故障
我想写一个使用套接字库的python web服务器。我已经通过了几个来源,不知道为什么我写的代码不起作用。其他人已经运行了非常类似的代码并声称它可行。我是python的新手,所以我可能会错过简单的东西。简单的Python Web服务器故障
它现在可以工作的唯一方法是将数据变量发送回客户端。浏览器打印原始的GET请求。当我尝试发送HTTP响应时,连接超时。
import socket
##Creates several variables, including the host name, the port to use
##the size of a transmission, and how many requests can be handled at once
host = ''
port = 8080
backlog = 5
size = 1024
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host,port))
s.listen(backlog)
while 1:
client, address = s.accept()
data = client.recv(16)
if data:
client.send('HTTP/1.0 200 OK\r\n')
client.send("Content-Type: text/html\r\n\r\n")
client.send('<html><body><h1>Hello World</body></html>')
client.close()
s.close()
你需要响应之前消耗输入,你不应该在你的while循环关闭套接字:
更换
client.recv(16)
与client.recv(size)
,消耗请求。将您的最后一行
s.close()
退回一个缩进,以便它不在您的while循环中。目前您正在关闭连接,然后再次尝试从中重新登录accept
,这样您的服务器将在第一次请求后崩溃。
除非您将此作为练习,否则您应该扩展SimpleHTTPServer而不是直接使用套接字。
此外,在创建套接字(绑定之前)后添加此行可修复您可能获得的任何“地址已被使用”错误。
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
祝你好运!
谢谢你的回应,格雷厄姆。我已经实现了更改(我最初有client.recv(大小),并更改它,因为我正在排除故障)。但是,这两个变化并没有什么不同。 – egoskeptical 2012-04-11 18:49:14
哦。它适用于我的Linux和Chrome浏览器。试试'size = 4096'确保你消耗的一切。查看Chrome或Firefox的网络检查员,看看是否能提供任何线索。 – 2012-04-11 18:53:08
这很奇怪。我在Windows 7上使用IE和FF。我试图增加大小。我注意到唯一不同的是,当我在浏览器中输入localhost:8080时,shell不会关闭。 Live HTTP Headers中没有任何内容显示。 – egoskeptical 2012-04-11 19:02:39
当你尝试运行它时会发生什么[除了这样做是为了学习套接字和/或HTTP,你在做什么是一个坏主意] – 2012-04-11 18:33:15
当我运行它时,shell弹出并等待,直到我键入localhost:8080进入浏览器。当我这样做时,外壳关闭。过了一会儿,浏览器显示连接超时。正如我前面提到的,如果我只向客户端发送数据变量,则Web浏览器将显示GET请求。 – egoskeptical 2012-04-11 18:43:49