• 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服务器还是要改不少东西的,但基本思路还是一样的,这里只做一个抛砖引玉的作用,希望能对大家有所帮助。

  • 相关阅读:
    jsp页面中使用 splitfn:split注意事项
    【SQL】- 基础知识梳理(二)
    【SQL】- 基础知识梳理(一)
    面向对象编程思想-解释器模式
    NPOI操作Excel
    面向对象编程思想-备忘录模式
    面向对象编程思想-访问者模式
    面向对象编程思想-责任链模式
    面向对象编程思想-策略模式
    面向对象编程思想-状态模式
  • 原文地址:https://www.cnblogs.com/buckets/p/5430460.html
Copyright © 2020-2023  润新知