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

最近在看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. SQL Server AlwaysOn 故障转移

    目的: a) AlwaysOn 可用性组功能是一个提供替代数据库镜像的企业级方案的高可用性和灾难恢复解决方案. b) 当数据库服务器SQL1出现故障宕机时,可以通过AlwaysOn可用性组,自动故障转 ...

  2. Java中两种实现多线程方式的对比分析

    本文转载自:http://www.linuxidc.com/Linux/2013-12/93690.htm#0-tsina-1-14812-397232819ff9a47a7b7e80a40613cf ...

  3. mysql的约束的讨论

    问题:该不该加约束,比如非空约束,外键约束 学院派会告诉你在设计的时候把应该有的约束都加上 而实践派得出的结论是主键一定加,非空约束尽量加,外键最好依赖于程序逻辑,而不是数据库,从而更好的拥抱变化,快 ...

  4. hibernate中先建表还是先建实体类

    在实际工作中往往是先建表然后再生成类原因:建好数据库表之后往往要对数据表进行一些优化,比如说建索引,比如说建中间表,比如建视图.如果先建类的话这些优化是无法生成的

  5. Android Intent的花样启动

    刚开始看郭大神的<>,实现以下里面的一些例子.Intent的花样启动 显示Intent的使用. 实例化一个Intent,并且制定当前的activity和要跳转到的activity Inte ...

  6. Picasso 加载图片到RelativeLayout之解决方案

    Picasso 加载图片到ImageView 或者自己的自定义View都是可以直接调用对应API的,但是用into(0直接也加载到RelatieLayout就不好使了,可以这样来: Picasso.w ...

  7. 关于 table-layout 属性

    我们经常会使用table,并且去手动的设置它的宽度,比如: <table> <tr> <td class="left">...</td&g ...

  8. centos 添加epel、remi仓库和ELRepo仓库

    centos使用yum安装软件非常方便,yum会自动安装软件的相关依赖.但是centos自带的源仓库,软件相对老旧并且不太全,所以我们可以添加第三方仓库,可以安装较新的软件版本. epel是fedor ...

  9. distance.c

    #include "stdio.h" #include "string.h" #include "math.h" #include &quo ...

  10. MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在

    问题描述:在用vs生成MVC时若使用Internet应用程序为模版,项目建好后重新编译下无法通过,弹出错误: 解决方案:问题出来后,询问了身边很多人都是一头雾水,于是乎各种谷歌和百度,还好功夫不负有心 ...