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

最近在看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服务器的更多相关文章

  1. Python中使用Flask、MongoDB搭建简易图片服务器

    主要介绍了Python中使用Flask.MongoDB搭建简易图片服务器,本文是一个详细完整的教程,需要的朋友可以参考下 1.前期准备 通过 pip 或 easy_install 安装了 pymong ...

  2. 50行Python代码构建小型区块链

    本文介绍了如何使用python构建一个小型的区块链技术,使用Python2实现,代码不到50行. Although some think blockchain is a solution waitin ...

  3. python爬虫实战:利用scrapy,短短50行代码下载整站短视频

    近日,有朋友向我求助一件小事儿,他在一个短视频app上看到一个好玩儿的段子,想下载下来,可死活找不到下载的方法.这忙我得帮,少不得就抓包分析了一下这个app,找到了视频的下载链接,帮他解决了这个小问题 ...

  4. 用不到 50 行的 Python 代码构建最小的区块链

    引用 译者注:随着比特币的不断发展,它的底层技术区块链也逐步走进公众视野,引起大众注意.本文用不到50行的Python代码构建最小的数据区块链,简单介绍了区块链去中心化的结构与其实现原理. 尽管一些人 ...

  5. Socket 简易静态服务器 WPF MVVM模式(一)

    整体代码下载 主要实现功能: Socket的简单应用 可修改IP和端口 显示来访信息 界面设计: 界面采用MVVM设计,很简陋. 前台的主要目的是 输入IP地址 输入端口 输入文件目录 开启监听和停止 ...

  6. C+命令行+方向键=简易版扫雷

    前言: 想起来做这个是因为那时候某天知道了原来黑框框里面的光标是可以控制的,而且又经常听人说起这个,就锻炼一下好了. 之前就完成了那1.0的版本,现在想放上来分享却发现有蛮多问题的,而且最重要的是没什 ...

  7. 基于requirejs+bluebird,50行代码实现轻巧实用的前端CMD加载器

    首先是github地址,可以用git克隆命令也可以直接在git页面下载 https://github.com/kazetotori/js-requireAsync 下载下来后目录结构是这样的 -pac ...

  8. 50行ruby代码开发一个区块链

    区块链是什么?作为一个Ruby开发者,理解区块链的最好办法,就是亲自动手实现一个.只需要50行Ruby代码你就能彻底理解区块链的核心原理! 区块链 = 区块组成的链表? blockchain.ruby ...

  9. [源码]Python简易http服务器(内网渗透大文件传输含下载命令)

    Python简易http服务器源码 import SimpleHTTPServerimport SocketServerimport sysPORT = 80if len(sys.argv) != 2 ...

随机推荐

  1. Java生成PDF报表

    一.前言 前几天,做ASN条码收货模块,需要实现打印下载收货报表,经一番查找,选定iText--用于生成PDF文档的一个Java类库.废话不多说,进入正题. 二.iText简介 iText是著名的开放 ...

  2. codevs1041

    codevs 1041 又到暑假了,住在城市A的Car想和朋友一起去城市B旅游.她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速铁路,第I个城市中高 ...

  3. MySQL----alter table modify | change的不同

    1.modify.change都可以修改列的属性:一同的是modify只能修改表的数据类型.change比它要牛逼一点它可以在修改数据类型的同时也修改列名. 2.modify 的语法:alter ta ...

  4. display属性值

    display属性值:none 此元素不会被显示. block 此元素将显示为块级元素,此元素前后会带有换行符. inline 默认.此元素会被显示为内联元素,元素前后没有换行符. inline-bl ...

  5. 本地拦截genymotion或者Android模拟器的网络请求

    我们在主机上面运行了Burp或者fiddler,那么代理已经监听在本机的8080端口了. 那么我们需要在模拟器中进行如下设置: 1.在设置中,长按当前连接的wifi网络,弹出如下: 2. 点击修改网络 ...

  6. Android混淆、反编译以及反破解的简单回顾

    =========================================================================虽然反编译很简单,也没下面说的那么复杂,不过还是转了过 ...

  7. Ubuntu之修改用户名和主机名

    记得曾几何时,想把自己电脑的“乌班兔儿”取个响亮的名字,但是问了很久度娘和谷哥,都要我把当前用户删除了(userdel -r xxx),重新建一个用户(adduser xxx),但是,我的电脑是所有环 ...

  8. Python学习笔记9-Python 链接MySql数据库

    Python 链接MySql数据库,方法很简单: 首先需要先 安装一个MySql链接插件:MySQL-python-1.2.3.win-amd64-py2.7.exe 下载地址:http://dev. ...

  9. #include <process.h>

    1 _beginthread 单进程,单线程,必须干完一件事情后干另一件事情 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #incl ...

  10. MySQL- 锁机制及MyISAM表锁

    锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许 多用户 共享的资源.如何保证数据并发访问的一致性.有效性是所 ...