博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
50行实现简易HTTP服务器
阅读量:7225 次
发布时间:2019-06-29

本文共 2488 字,大约阅读时间需要 8 分钟。

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

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

    依旧是惯例先上代码:

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

转载于:https://www.cnblogs.com/buckets/p/5430460.html

你可能感兴趣的文章
ASP.NET运行时错误
查看>>
acdream 1014 Dice Dice Dice(组合)
查看>>
javascript异步编程系列【七】----扫盲,我们为什么要用Jscex
查看>>
WindowsServer2003+IIS6+ASP+NET+PHP+MSSQL+MYSQL配置说明 |备份于waw.cnblogs.com
查看>>
MVC中几种常用ActionResult
查看>>
[转]Linux下实用的查看内存和多核CPU状态命令
查看>>
【踩坑记】从HybridApp到ReactNative
查看>>
maven全局配置文件settings.xml详解
查看>>
23种设计模式之状态模式(State)
查看>>
【Android小项目】找不同,改编自"寻找房祖名"的一款开源小应用。
查看>>
jquery文档操作
查看>>
用keras做SQL注入攻击的判断
查看>>
JS判断图片加载完成方法
查看>>
window.print ()
查看>>
【玩转Ubuntu】01. Ubuntu上配置JDK
查看>>
Leetcode: Path Sum
查看>>
我为什么放弃Go语言
查看>>
pthread_rwlock
查看>>
WEB打印(jsp版)
查看>>
URLEncode与URLDecode总结与实现
查看>>