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":'',"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服务器的更多相关文章
- Python中使用Flask、MongoDB搭建简易图片服务器
主要介绍了Python中使用Flask.MongoDB搭建简易图片服务器,本文是一个详细完整的教程,需要的朋友可以参考下 1.前期准备 通过 pip 或 easy_install 安装了 pymong ...
- 50行Python代码构建小型区块链
本文介绍了如何使用python构建一个小型的区块链技术,使用Python2实现,代码不到50行. Although some think blockchain is a solution waitin ...
- python爬虫实战:利用scrapy,短短50行代码下载整站短视频
近日,有朋友向我求助一件小事儿,他在一个短视频app上看到一个好玩儿的段子,想下载下来,可死活找不到下载的方法.这忙我得帮,少不得就抓包分析了一下这个app,找到了视频的下载链接,帮他解决了这个小问题 ...
- 用不到 50 行的 Python 代码构建最小的区块链
引用 译者注:随着比特币的不断发展,它的底层技术区块链也逐步走进公众视野,引起大众注意.本文用不到50行的Python代码构建最小的数据区块链,简单介绍了区块链去中心化的结构与其实现原理. 尽管一些人 ...
- Socket 简易静态服务器 WPF MVVM模式(一)
整体代码下载 主要实现功能: Socket的简单应用 可修改IP和端口 显示来访信息 界面设计: 界面采用MVVM设计,很简陋. 前台的主要目的是 输入IP地址 输入端口 输入文件目录 开启监听和停止 ...
- C+命令行+方向键=简易版扫雷
前言: 想起来做这个是因为那时候某天知道了原来黑框框里面的光标是可以控制的,而且又经常听人说起这个,就锻炼一下好了. 之前就完成了那1.0的版本,现在想放上来分享却发现有蛮多问题的,而且最重要的是没什 ...
- 基于requirejs+bluebird,50行代码实现轻巧实用的前端CMD加载器
首先是github地址,可以用git克隆命令也可以直接在git页面下载 https://github.com/kazetotori/js-requireAsync 下载下来后目录结构是这样的 -pac ...
- 50行ruby代码开发一个区块链
区块链是什么?作为一个Ruby开发者,理解区块链的最好办法,就是亲自动手实现一个.只需要50行Ruby代码你就能彻底理解区块链的核心原理! 区块链 = 区块组成的链表? blockchain.ruby ...
- [源码]Python简易http服务器(内网渗透大文件传输含下载命令)
Python简易http服务器源码 import SimpleHTTPServerimport SocketServerimport sysPORT = 80if len(sys.argv) != 2 ...
随机推荐
- 基于粒子滤波的物体跟踪 Particle Filter Object Tracking
Video来源地址 一直都觉得粒子滤波是个挺牛的东西,每次试图看文献都被复杂的数学符号搞得看不下去.一个偶然的机会发现了Rob Hess(http://web.engr.oregonstate.edu ...
- JQuery获取Checkbox组的值
前台: <div id="addtrtr" style="padding:20px; background-color:#F8F8F8;"> < ...
- 读书笔记-Coding faster(英文版)
读书笔记-Coding faster(英文版) Getting More Productive with Microsoft visual Studio Author: Zain Naboulsi S ...
- Oracle User Management FAQ翻译及学习笔记
转载 最近了解到AME 的东西,很迫切,先转载一篇 [@more@] Oracle User Management FAQ翻译及学习笔记 写在前面 本文主要是翻译的英文版的Oracle User Ma ...
- C# 10 总复习
数据类型--变量与常量--运算符与表达式--语句(if,for)--数组--函数--结构体 一.数据类型: (一)内建类型 整型(int short long byte uint ushort ulo ...
- BZOJ 4011: [HNOI2015]落忆枫音( dp )
DAG上有个环, 先按DAG计数(所有节点入度的乘积), 然后再减去按拓扑序dp求出的不合法方案数(形成环的方案数). ---------------------------------------- ...
- Google机器学习教程心得(二)决策树与可视化
Visualizing a Decision Tree Google Machine Learning Recipes 2 官方中文博客 http://chinagdg.org/2016/03/mac ...
- setTimeout()与setInterval() 问题
提示:setTimeout() 只执行 code 一次.如果要多次调用,请使用 setInterval() 或者让 code 自身再次调用 setTimeout(). 1. setInterval(c ...
- C语言的本质(8)——副作用与顺序点
C 语言中,术语副作用是指对数据对象或者文件的修改.例如以下语句 var = 99; 的副作用是把 var 的值修改成 99.对表达式求值也可能产生副作用,例如: se = 100 对这个表达式求值所 ...
- mysql允许远程IP访问
默认情况下Linux内的mysql数据库mysql,user表内的用户权限只是对localhost即本机才能登陆.需要更改权限: mysql> Grant all privileges on * ...