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'
3
  • 1
    Please a) fix your indentation and b) show the full error message and traceback. Commented Oct 29, 2016 at 15:23
  • Possible duplicate of TypeError: a bytes-like object is required, not 'str' Commented Oct 29, 2016 at 15:33
  • @DanielRoseman Hi, I have updated it and mentioned the full error. Please let me know the modifications. Commented Oct 29, 2016 at 16:10

1 Answer 1

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"))`
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.