话说由于一直很懒,所以博客好像也没怎么更新。。。今天有空就写一下吧。
最近在看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服务器还是要改不少东西的,但基本思路还是一样的,这里只做一个抛砖引玉的作用,希望能对大家有所帮助。
时间: 2024-11-12 14:31:13