Reputation: 81
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()
Upvotes: 4
Views: 18367
Reputation: 5553
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'))
Upvotes: 0
Reputation: 70344
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...
Upvotes: 6