简单的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() 
+0

当你尝试运行它时会发生什么[除了这样做是为了学习套接字和/或HTTP,你在做什么是一个坏主意] – 2012-04-11 18:33:15

+0

当我运行它时,shell弹出并等待,直到我键入localhost:8080进入浏览器。当我这样做时,外壳关闭。过了一会儿,浏览器显示连接超时。正如我前面提到的,如果我只向客户端发送数据变量,则Web浏览器将显示GET请求。 – egoskeptical 2012-04-11 18:43:49

你需要响应之前消耗输入,你不应该在你的while循环关闭套接字:

  1. 更换client.recv(16)client.recv(size),消耗请求。

  2. 将您的最后一行s.close()退回一个缩进,以便它不在您的while循环中。目前您正在关闭连接,然后再次尝试从中重新登录accept,这样您的服务器将在第一次请求后崩溃。

除非您将此作为练习,否则您应该扩展SimpleHTTPServer而不是直接使用套接字。

此外,在创建套接字(绑定之前)后添加此行可修复您可能获得的任何“地址已被使用”错误。

s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 

祝你好运!

+0

谢谢你的回应,格雷厄姆。我已经实现了更改(我最初有client.recv(大小),并更改它,因为我正在排除故障)。但是,这两个变化并没有什么不同。 – egoskeptical 2012-04-11 18:49:14

+0

哦。它适用于我的Linux和Chrome浏览器。试试'size = 4096'确保你消耗的一切。查看Chrome或Firefox的网络检查员,看看是否能提供任何线索。 – 2012-04-11 18:53:08

+0

这很奇怪。我在Windows 7上使用IE和FF。我试图增加大小。我注意到唯一不同的是,当我在浏览器中输入localhost:8080时,shell不会关闭。 Live HTTP Headers中没有任何内容显示。 – egoskeptical 2012-04-11 19:02:39