2010-10-01 131 views
4

这是一个简单的服务器。当您将浏览器类型打开到服务器的地址中时,它会响应状态码和请求的html的内容。但是当我添加这个句子“connectionSocket.send('HTTP/1.1 200 OK')”时,没有任何返回。当我删除它时,html返回。另一个问题是,当我通过Web浏览器发送请求时,有两个连接发送到服务器,一个显示它想要找到一个名为favicon.ico的文件,但当然这是一个IOError,因为没有这样的文件我的服务器的根目录。代码附后,并感谢您的帮助。有一个由python编写的简单服务器的问题

 

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

+3

+1:就像好时光,当我们写我们从头开始所有的软件,而无需使用任何库。布拉沃。 -1:使用'socket'库是欺骗行为。您应该直接使用'/ dev/eth'驱动程序。 – 2010-10-01 14:59:18

回答

4

您需要添加到换行符(\r\n\r\n)的HTTP标头的结尾:

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

另外,你或许应该使用更更高层次库编写的HTTP服务器.. 。

+0

感谢您的回复,它的工作原理。这意味着'HTTP/1.1 200 OK \ r \ n \ r \ n'是一个正式的http响应头,当浏览器完全读取这行时,甚至没有一个丢失的字母,浏览器就知道这是一个头文件? – user449110 2010-10-01 15:15:58

+0

恩,我不太确定。阅读HTTP规范(RFC,或者如果你不需要知道的话,就去看维基百科)。基本上,这些协议用新行终止标题条目,并用两条新行标题分隔内容。 – 2010-10-01 15:19:49

+0

@ user449110:请阅读RFC 2616. http://www.faqs.org/rfcs/rfc2616.html。你的问题在那里回答。如果你要继续写这种软件,你必须**知道这些标准。 – 2010-10-01 15:20:38

0

,你是否尝试从string转换的返回值来bytes

替换此:

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

随着这

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