4
votes

This is a simple server. When you open the browser type into the address of the server, and it will response a status code and the content of the requested html. But when I add this sentence "connectionSocket.send('HTTP/1.1 200 OK')", nothing returned. When I removed it, the html returned. And another problem is when I send the request by web browser, there are two connect sent to the server, and one displays it wanna find a file named favicon.ico, but of course it is a IOError because there is not such a file on my server's root directory. Code is attached and thanks for help.


#import socket module

from socket import *
serverSocket = socket(AF_INET,SOCK_STREAM)
#prepare a server socket

serverSocket.bind(('192.168.0.101', 8765))
serverSocket.listen(1)

while True:

    #Establish the connection

    print 'Ready to serve...'
    connectionSocket,addr =  serverSocket.accept()
    print 'connected from',addr
    try:
        message = connectionSocket.recv(1024)
        filename = message.split()[1]
        print filename
        f = open(filename[1:])
        outputdata = f.read()

        #Send one HTTP header line into socket

        #connectionSocket.send('HTTP/1.1 200 OK')

        #Send the content of the requested file to the client

        for i in range(0,len(outputdata)):
            connectionSocket.send(outputdata[i])
        connectionSocket.close()
    except IOError:
        print 'IOError'

        #Send response message for file not found

        connectionSocket.send('file not found')

        #Close Client socket

        connectionSocket.close()
serverSocket.close()

2
+1: Just like the good-old days when we wrote all our software from scratch without using any libraries. Bravo. -1: Using the socket library is cheating. You should use the /dev/eth driver directly.S.Lott

2 Answers

5
votes

You need to add to newlines (\r\n\r\n) to the end of the HTTP headers:

connectionSocket.send('HTTP/1.1 200 OK\r\n\r\n')

Also, you should probably be using a more higher level library for writing your HTTP server...

0
votes

Have you tried converting the return value from string to bytes

Replace this:

connectionSocket.send('HTTP/1.1 200 OK\r\n\r\n')

With This

connectionSocket.send(bytes('HTTP/1.1 200 OK\r\n\r\n','UTF-8'))