码迷,mamicode.com
首页 > Web开发 > 详细

50行实现简易HTTP服务器

时间:2016-04-25 13:10:14      阅读:184      评论:0      收藏:0      [点我收藏+]

标签:

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

    最近在看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\nContent-Type: "+self.__option[responseType]+"; charset="+self.__option[charset]+"\nContent-Length: "+str(len(self.__responseBody))+"\nDate: "+date+"\nConnection: "+self.__option[connection]+"\n\n"
    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服务器还是要改不少东西的,但基本思路还是一样的,这里只做一个抛砖引玉的作用,希望能对大家有所帮助。

50行实现简易HTTP服务器

标签:

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!