50行实现简易HTTP服务器

    话说由于一直很懒,所以博客好像也没怎么更新。。。今天有空就写一下吧。

    最近在看node.js的时候开始对http协议感兴趣了,毕竟node一开始就是为了做web服务器而产生的。于是试着想了一下大概的思路,基本上就是用socket建立连接,监听端口,然后将请求转发到我的服务器,最后输出响应就好了。今天上午花了一点时间去实现了一下,发现是OK的。就记一下。顺带——python对于这种东西实现起来就是快!

    依旧是惯例先上代码:

import socket,datetime,sys
class Http(object):
    """docstring for Http"""
    __sock=()
    __buf=''
    __connection=()
    __address=()
    __option={"host":'localhost',"port":'8991',"listen":5,"responseType":'text/html',"charset":'utf-8','connection':'keep-alive','timeout':5,'recv_len':4096}
    __content=''
    __responseHeader=''
    __responseBody=''
    def __init__(self, option={}):
        self.initSocket(option);
        print "initSocket Finish"
        
        
    def initSocket(self,option):
        for k,v in option.items():
            if self.__option.has_key(k):
                self.__option[k]=v
        self.__sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM);
        self.__sock.bind((self.__option['host'], int(self.__option['port'])));
        self.__sock.listen(self.__option['listen']);
    def initResponseHeader(self):
        date=self.__createGMTTime();
        self.__responseHeader="HTTP/1.1 200 OK
Content-Type: "+self.__option['responseType']+"; charset="+self.__option['charset']+"
Content-Length: "+str(len(self.__responseBody))+"
Date: "+date+"
Connection: "+self.__option['connection']+"

"
    def __createResponse(self):
        self.initResponseHeader();
        print "initResponseHeader Finish"
        return self.__responseHeader+self.__responseBody
    def __createGMTTime(self):
        GMT_FORMAT = '%a, %d %b %Y %H:%M:%S GMT';
        return datetime.datetime.utcnow().strftime(GMT_FORMAT);

    def start(self,content):       
        self.__responseBody=content
        while True:
            self.__connection,self.__address = self.__sock.accept();
            print self.__connection,self.__address
            try:
                self.__connection.settimeout(self.__option['timeout']);
                self.__buf = self.__connection.recv(self.__option['recv_len']);
                self.__connection.send(self.__createResponse())
                print self.__buf
            except socket.timeout:
                print 'time out'
            self.__connection.close()


if __name__ == '__main__':
    http=Http();
    http.start(content="It's OverWorks")

    去掉空行应该不到50行,整体思路应该还算清晰。首先是初始化socket的参数,然后拼接报文,最后response内容。

    当然这只是一个试验性质的,你如果想要做一个完整的web服务器还是要改不少东西的,但基本思路还是一样的,这里只做一个抛砖引玉的作用,希望能对大家有所帮助。

原文地址:https://www.cnblogs.com/buckets/p/5430460.html