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":‘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

50行实现简易HTTP服务器的相关文章

基于Tkinter用50行Python代码实现简易计算器

Tkinter一般是python自带的,所以代码不需要其他组件,本程序是在python2.7版本实现的. 主要涉及了tkinter的使用,函数定义和调用,匿名函数的使用,类成员函数定义等python基础知识,适合新手学习. 代码如下: from Tkinter import * #创建横条型框架 def frame(root, side): w = Frame(root) w.pack(side = side, expand = YES, fill = BOTH) return w #创建按钮

Socket 初识 用Socket建立一个简易Web服务器

摘自<Asp.Net 本质论>作者:郝冠军 //在.Net中.system.Net命名空间提供了网络编程的大多数数据据类型以及常用操作,其中常用的类型如下:/*IPAddress 类表示一个IP地址* IPEndPoint类用来表示一个IP地址和一个端口号的组合,成为网络的端点.* System.Net.Sockets命名空间中提供了基于Socked编程的数据类型.* Socket类封装了Socked的操作.* 常见的操作:* Listen:设置基于连接通信的Socket进入监听状态,并设置等

阻塞式简易http服务器

说明         使用java.net包的ServerSocket也是阻塞的,所以下面的实例把ServerSocketChannel换成ServerSocket效果一样. 后台代码 1 package study.socket.tcp.block.httpserver; 2 3 import java.io.FileInputStream; 4 import java.io.IOException; 5 import java.net.InetSocketAddress; 6 import

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

本文介绍了如何使用python构建一个小型的区块链技术,使用Python2实现,代码不到50行. Although some think blockchain is a solution waiting for problems, there's no doubt that this novel technology is a marvel of computing. But, what exactly is a blockchain?虽然有人认为区块链本身仍有很多问题需要解决,但毫无疑问,这种

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

引用 译者注:随着比特币的不断发展,它的底层技术区块链也逐步走进公众视野,引起大众注意.本文用不到50行的Python代码构建最小的数据区块链,简单介绍了区块链去中心化的结构与其实现原理. 尽管一些人认为区块链是一个等待问题的解决方案,但毫无疑问,这种新技术是计算机的奇迹.但是,区块链到底是什么呢? 区块链 它是比特币或其他加密货币进行交易的数字账本,账本按时间顺序记录并对外公开. 在更一般的术语中,它是一个公共数据库,新数据存储在一个名为块的容器中,并被添加到一个不可变链(后来的区块链)中添加

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

近日,有朋友向我求助一件小事儿,他在一个短视频app上看到一个好玩儿的段子,想下载下来,可死活找不到下载的方法.这忙我得帮,少不得就抓包分析了一下这个app,找到了视频的下载链接,帮他解决了这个小问题. 因为这个事儿,勾起了我另一个念头,这不最近一直想把python爬虫方面的知识梳理梳理吗,干脆借机行事,正凑着短视频火热的势头,做一个短视频的爬虫好了,中间用到什么知识就理一理. 我喜欢把事情说得很直白,如果恰好有初入门的朋友想了解爬虫的技术,可以将就看看,或许对你的认识会有提升.如果有高手路过,

Java实现一个简易HTTP服务器(一)-- socket

Java实现一个简易HTTP服务器(一)-- socket -----2019-9-29---------- public class Server { public static void main(String[] args) throws IOException { ServerSocket serverSocket = new ServerSocket(89); System.out.println("Server started at " + new Date() + &qu

理解tomcat之搭建简易http服务器

做过java web的同学都对tomcat非常熟悉.我们在使用tomcat带来的便利的同时,是否想过tomcat是如何工作的呢?tomcat本质是一个http服务器,本篇文章将搭建一个简单的http服务器. 1 Catalina模型 首先我们先了解一下tomcat的大致工作原理.tomcat的核心是servlet容器,我们称它为Catalina(为什么叫这个名字?我也不知道 ̄へ ̄).模型图如1.1 图1.1 Connector是用来"连接"容器里边的请求的.它的工作是为接收到每一个 H

简易JAVA_WEB服务器处理POST请求得到内容

package com.zhao.test; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.net.ServerSocket; import java.net.Socket; import java.net.URLDecoder; /** * * @author