Search code examples
pythonhttpsocketswebserverwebsocket

How can I implement a simple web server using Python without using any libraries?


I need to implement a very simple web-server-like app in Python which would perform basic HTTP requests and responses and display very basic output on the web page. I am not too concerned about actually coding it in Python, but I am not sure where to start? How to set this up? One file? Multiple files? I guess I have no idea how to approach the fact that this is a "server" - so I am unfamiliar with how to approach dealing with HTTP requests/sockets/processing requests, etc. Any advice? Resources?


Solution

  • You can use socket programming for this purpose. The following snippet creates a tcp socket and listens on port 9000 for http requests:

    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()
    

    Start the server, $ python server.py. Open http://localhost:9000/ in your web-browser (which acts as client). Then in the browser window, you can see the text "Hello World" (http response).

    EDIT** The previous code was only tested on chrome, and as you guys suggested about other browsers, the code was modified as:

    1. To make the response http-alike you can send in plain header with http version 1.1, status code 200 OK and content-type text/html.
    2. The client socket needs to be closed once response is submitted as it's a TCP socket.
    3. To properly close the client socket, shutdown() needs to be called socket.shutdown vs socket.close

    Then the code was tested on chrome, firefox (http://localhost:9000/) and simple curl in terminal (curl http://localhost:9000).