Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
简单pythonweb服务器故障_Python_Sockets_Webserver - Fatal编程技术网

简单pythonweb服务器故障

简单pythonweb服务器故障,python,sockets,webserver,Python,Sockets,Webserver,我正在尝试使用套接字库编写python web服务器。我已经浏览了好几个源代码,不明白为什么我写的代码不起作用。其他人运行了非常类似的代码,并声称它是有效的。我是python新手,所以可能缺少一些简单的东西 现在唯一可行的方法是将数据变量发送回客户机。浏览器打印原始GET请求。当我尝试发送HTTP响应时,连接超时 import socket ##Creates several variables, including the host name, the port to use ##the s

我正在尝试使用套接字库编写python web服务器。我已经浏览了好几个源代码,不明白为什么我写的代码不起作用。其他人运行了非常类似的代码,并声称它是有效的。我是python新手,所以可能缺少一些简单的东西

现在唯一可行的方法是将数据变量发送回客户机。浏览器打印原始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()
导入套接字
##创建多个变量,包括主机名、要使用的端口
##传输的大小,以及一次可以处理多少请求
主机=“”
端口=8080
积压=5
大小=1024
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s、 绑定((主机、端口))
s、 倾听(待办事项)
而1:
客户端,地址=s.accept()
数据=client.recv(16)
如果数据:
client.send('HTTP/1.0 200正常\r\n')
client.send(“内容类型:text/html\r\n\r\n”)
client.send('Hello World')
client.close()
s、 关闭()

您需要在响应之前使用输入,并且不应关闭while循环中的套接字:

  • client.recv(16)
    替换为
    client.recv(size)
    ,以使用请求

  • 将最后一行
    s.close()
    向后移动一个缩进,使其不在while循环中。此时,您正在关闭连接,然后再次尝试
    从中接受
    ,因此您的服务器将在第一次请求后崩溃

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

    另外,在创建套接字之后(绑定之前)添加这一行可以修复您可能遇到的任何“地址已在使用”错误

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

    祝你好运

    当您尝试运行它时会发生什么情况[顺便说一句,除了学习套接字和/或HTTP之外,您所做的是个坏主意]当我运行它时,shell会弹出并等待,直到我在浏览器中键入localhost:8080。当我这样做时,外壳关闭。过了一会儿,浏览器显示连接超时。如前所述,如果我只向客户端发送数据变量,web浏览器将显示GET请求。感谢您的回复,Graham。我已经实现了这些更改(我最初使用client.recv(size)并更改了它,因为我正在进行故障排除)。然而,这两个变化没有什么区别。它适用于我在Linux上使用Chrome浏览器。尝试
    size=4096
    以确保您正在消费所有东西。查看Chrome或Firefox的网络检查器,看看是否有任何线索。这很奇怪。我在Windows7上使用IE和FF。我试着加大尺寸。我注意到唯一不同的是,当我在浏览器中键入localhost:8080时,shell现在没有关闭。Live HTTP标头中没有显示任何内容。我卸载了当前版本(3.2.3)并安装了2.7,它正常工作。谢谢你的帮助,格雷厄姆。