如何在不使用任何库的情况下使用Python实现简单的web服务器?

如何在不使用任何库的情况下使用Python实现简单的web服务器?,python,http,sockets,webserver,websocket,Python,Http,Sockets,Webserver,Websocket,我需要用Python实现一个非常简单的类似web服务器的应用程序,它将执行基本的HTTP请求和响应,并在网页上显示非常基本的输出。我并不太关心用Python编写代码,但我不确定从哪里开始?如何设置?一个文件?多个文件?我想我不知道如何处理这是一个“服务器”,所以我不知道如何处理HTTP请求/套接字/处理请求等。有什么建议吗?参考资料?您应该查看(py3:)模块 根据您尝试做什么,您可以直接使用它,也可以查看模块的源代码(,)以获取想法 如果您想获得更低级的功能,SimpleHttpServer将

我需要用Python实现一个非常简单的类似web服务器的应用程序,它将执行基本的HTTP请求和响应,并在网页上显示非常基本的输出。我并不太关心用Python编写代码,但我不确定从哪里开始?如何设置?一个文件?多个文件?我想我不知道如何处理这是一个“服务器”,所以我不知道如何处理HTTP请求/套接字/处理请求等。有什么建议吗?参考资料?

您应该查看(py3:)模块

根据您尝试做什么,您可以直接使用它,也可以查看模块的源代码(,)以获取想法

如果您想获得更低级的功能,SimpleHttpServer将扩展()以使其正常工作

如果您想获得更低级的,请查看(源代码:,)

如果人们只想共享一个目录,他们通常会运行python,比如
python-msimplehttpserver
(或者
python3-mshttp.server
):这是一个功能齐全的。。。简单服务器。

可用于此目的。以下代码段创建tcp套接字并在端口9000上侦听http请求:

from socket import *

def createServer():
    serversocket = socket(AF_INET, SOCK_STREAM)
    serversocket.bind(('localhost',9000))
    serversocket.listen(5)
    while(1):
        (clientsocket, address) = serversocket.accept()
        clientsocket.send("HTTP/1.1 200 OK\n"
         +"Content-Type: text/html\n"
         +"\n" # Important!
         +"<html><body>Hello World</body></html>\n")
        clientsocket.shutdown(SHUT_WR)
        clientsocket.close()

    serversocket.close()

createServer()
从套接字导入*
def createServer():
serversocket=socket(AF\u INET,SOCK\u STREAM)
绑定(('localhost',9000))
serversocket.listen(5)
而(一):
(clientsocket,address)=serversocket.accept()
clientsocket.send(“HTTP/1.1 200确定\n”
+“内容类型:text/html\n”
+“\n”#重要!
+“你好,世界\n”)
clientsocket.关机(关机)
clientsocket.close()
serversocket.close()
createServer()
启动服务器,
$python server.py
。 打开
http://localhost:9000/
在web浏览器中(充当客户端)。然后在浏览器窗口中,您可以看到文本“Hello World”(http响应)

编辑** 前面的代码只在chrome上测试过,正如你们对其他浏览器的建议,代码被修改为:

  • 要使响应http相似,您可以使用http版本1.1、状态代码200OK和内容类型text/html以普通标题发送
  • 提交响应后需要关闭客户端套接字,因为它是TCP套接字
  • 要正确关闭客户端套接字,需要调用
    shutdown()

  • 然后在chrome、firefox()和simplecurlinterminal(curl)上对代码进行了测试

    我决定在Python3中实现这一点,并将其用于Chrome,作为我正在开发的在线课程的示例。Python 3当然需要将
    encode()
    decode()
    放在正确的位置。Chrome-确实希望在获取数据之前发送其GET请求。我还添加了一些错误检查,以便在您中止服务器或服务器崩溃时清理其套接字:

    def createServer():
        serversocket = socket(AF_INET, SOCK_STREAM)
        try :
            serversocket.bind(('localhost',9000))
            serversocket.listen(5)
            while(1):
                (clientsocket, address) = serversocket.accept()
    
                rd = clientsocket.recv(5000).decode()
                pieces = rd.split("\n")
                if ( len(pieces) > 0 ) : print(pieces[0])
    
                data = "HTTP/1.1 200 OK\r\n"
                data += "Content-Type: text/html; charset=utf-8\r\n"
                data += "\r\n"
                data += "<html><body>Hello World</body></html>\r\n\r\n"
                clientsocket.sendall(data.encode())
                clientsocket.shutdown(SHUT_WR)
    
        except KeyboardInterrupt :
            print("\nShutting down...\n");
        except Exception as exc :
            print("Error:\n");
            print(exc)
    
        serversocket.close()
    
    print('Access http://localhost:9000')
    createServer()
    

    但这是一个非常好的例子,主要说明了为什么您希望使用Flask或DJango之类的框架,而不是编写自己的框架。感谢您的初始代码。

    上面提到了一个非常简单的解决方案,但上面的解决方案不起作用。该解决方案在chrome上进行了测试,效果良好。这是Python3,尽管它可能在Python2上工作,因为我从未测试过它

    from socket import *
    
    def createServer():
        serversocket = socket(AF_INET, SOCK_STREAM)
        serversocket.bind(('localhost',9000))
        serversocket.listen(5)
        while(1):
            (clientsocket, address) = serversocket.accept()
            clientsocket.send(bytes("HTTP/1.1 200 OK\n"
             +"Content-Type: text/html\n"
             +"\n" # Important!
             +"<html><body>Hello World</body></html>\n",'utf-8'))
            clientsocket.shutdown(SHUT_WR)
            clientsocket.close()
    
        serversocket.close()
    
    createServer()
    
    从套接字导入*
    def createServer():
    serversocket=socket(AF\u INET,SOCK\u STREAM)
    绑定(('localhost',9000))
    serversocket.listen(5)
    而(一):
    (clientsocket,address)=serversocket.accept()
    clientsocket.send(字节)(“HTTP/1.1 200确定\n”
    +“内容类型:text/html\n”
    +“\n”#重要!
    +“Hello World\n”、“utf-8”))
    clientsocket.关机(关机)
    clientsocket.close()
    serversocket.close()
    createServer()
    

    这比已被接受的答案有所改进,但我将发布这篇文章,以便将来的用户可以轻松使用。

    进一步解释您的要求(以及原因)。您是想实现完整的应用程序级堆栈,还是可以使用Apache?更多地解释你需要什么以及为什么。最后,当您有“websocket”标记时,您的意思是它,还是仅仅使用了一个不正确的标记?没有使用任何库?肯定至少需要
    socket
    ?检查页面,这里我假设“任何库”都是python安装中未包含的库。@Wooble:我认为假设“任何库”是指“任何非标准库”是相当公平的。我可能会说您应该先检查HTTP文档。像RFC-1。你试过这个吗?这根本不起作用;它是一个套接字服务器,但不讲HTTP。它实际上不讲HTTP,所以几乎每个浏览器都不能使用它。它在Chrome中不起作用。只有在Firefox中按下停止按钮,它才能工作。这不是一个web服务器。我复制了你的脚本并运行了它,我收到一个错误,它说
    需要一个类似字节的对象而不是'str'
    如何修复这个问题?@Simon稍微修改了代码。它也在Python2.7.6上进行了测试。如果您使用的是python 3,其中字符串是Unicode;但在网络上传输时,我们需要发送字节字符串。因此,尝试sendall()而不是send(),字符串输出编码为utf-8#START output=“It works”clientsocket.sendall(output.encode(“utf-8”)#ENDSuper!这正是我需要的。我确实使用Python3,因此'sendall()`和
    .encode(“utf-8”)
    是绝对必要的,这两个选项都修复了我遇到的错误。到目前为止,我所有的服务器尝试都失败了,所以我非常感激。这是一次当之无愧的投票,但是我不喜欢
    clientsocket.send(“HTTP/1.1 200 OK\n”+”内容类型:text/html\n“+”\n”#重要!+“Hello World\n”)
    这不应该是同一行吗?我不得不修改那部分。再次感谢。:)欢迎来到堆栈溢出。这个问题几乎是重复的。唯一
    from socket import *
    
    def createServer():
        serversocket = socket(AF_INET, SOCK_STREAM)
        serversocket.bind(('localhost',9000))
        serversocket.listen(5)
        while(1):
            (clientsocket, address) = serversocket.accept()
            clientsocket.send(bytes("HTTP/1.1 200 OK\n"
             +"Content-Type: text/html\n"
             +"\n" # Important!
             +"<html><body>Hello World</body></html>\n",'utf-8'))
            clientsocket.shutdown(SHUT_WR)
            clientsocket.close()
    
        serversocket.close()
    
    createServer()