1

I have to create a web server in Python. Below is the code I am working on. When i execute it, I initially get no error and it prints "Ready to serve.." , but after opening a browser and running http://10.1.10.187:50997/HelloWorld.html (HelloWorld is an html file in the same folder as my python code, while 10.1.10.187 is my IP address and 50997) is the server port), I get a TypeError saying 'a bytes like object is required and not str". please help me in resolving this and kindly let me know if any other modifications are required.

    #Import socket module
    from socket import *

    #Create a TCP server socket
    #(AF_INET is used for IPv4 protocols)
    #(SOCK_STREAM is used for TCP)

    # Assign a port number
    serverPort = 50997

    serverSocket = socket(AF_INET, SOCK_STREAM)

    #serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)      

    #print ("hostname is: "), gethostname()
    #print ("hostname is: "), socket.gethostname()                          

    # Bind the socket to server address and server port
    serverSocket.bind(("", serverPort))

    # Listen to at most 1 connection at a time
    serverSocket.listen(1)

    # Server should be up and running and listening to the incoming    connections
    while True:
    print ("Ready to serve...")

        # Set up a new connection from the client
        connectionSocket, addr = serverSocket.accept()

        try:
            # Receives the request message from the client
            message =  connectionSocket.recv(1024)
            print ("Message is: "), message

            filename = message.split()[1]
            print ("File name is: "), filename

            f = open(filename[1:])

            outputdata = f.read()
            connectionSocket.send("HTTP/1.1 200 OK\r\n\r\n")

    for i in range(0, len(outputdata)):  
        connectionSocket.send(outputdata[i])
    connectionSocket.send("\r\n")

    # Close the client connection socket
    connectionSocket.close()

except IOError:
    # Send HTTP response message for file not found
    connectionSocket.send("HTTP/1.1 404 Not Found\r\n\r\n")
    connectionSocket.send("<html><head></head><body><h1>404 Not Found</h1></body></html>\r\n")
    # Close the client connection socket
    connectionSocket.close()

    serverSocket.close() 

The error I am exacly getting-

    Ready to serve...
    Message is: 
    File name is: 
    Traceback (most recent call last):
    File "intro.py", line 56, in <module>
    connectionSocket.send("HTTP/1.1 200 OK\r\n\r\n")
    TypeError: a bytes-like object is required, not 'str'
kshama
  • 49
  • 1
  • 2
  • 6
  • 1
    Please a) fix your indentation and b) show the full error message and traceback. – Daniel Roseman Oct 29 '16 at 15:23
  • Possible duplicate of [TypeError: a bytes-like object is required, not 'str'](http://stackoverflow.com/questions/33003498/typeerror-a-bytes-like-object-is-required-not-str) – Steffen Ullrich Oct 29 '16 at 15:33
  • @DanielRoseman Hi, I have updated it and mentioned the full error. Please let me know the modifications. – kshama Oct 29 '16 at 16:10

1 Answers1

1

You need to convert the string you are sending into bytes, using a text format. A good text format to use is UTF-8. You can implement this conversion like so:

bytes(string_to_convert, 'UTF-8')

or, in the context of your code:

connectionSocket.send(bytes("HTTP/1.1 404 Not Found\r\n\r\n","UTF-8"))
connectionSocket.send(bytes("<html><head></head><body><h1>404 Not Found</h1></body></html>\r\n","UTF-8"))`
FlipTack
  • 413
  • 3
  • 15