自己动手开发简易的Web服务器

使用python实现一个简易版的web服务器,旨在了解web服务器的工作原理,及了解HTTP协议。没有涉及多线程处理,并发之类的内容,以后再专门另外研究。首先上代码,稍后再作讲解。

# coding=utf-8
import socket

class httpd(object):

        def __init__(self,host,port):
                self.host = host
                self.port = port

        def parse_info(self,data):
                global _ENV
                _ENV = {}
                lines = data.splitlines()
                if len(lines)>0:
                        info = lines[0].split()
                        _ENV["method"] = info[0]
                        _ENV["uri"] = info[1]
                        del lines[0]
                        for i in lines:
                                offset = i.index(":")
                                _ENV[ i[0:offset] ] = i[offset+1::] 

        def log( self,data ):
                f = open("access.log","a")
                f.write( data )
                f.close()

        def start(self):
                print "python web server starring...\nlisten at %s" % self.port
                httpd = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
                httpd.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
                httpd.bind((self.host,self.port))
                httpd.listen(5)

                while True:
                        conn,addr = httpd.accept()
                        request_data = conn.recv(1024)
                        self.log( request_data )
                        self.parse_info( request_data.strip() )
                        body = "HTTP/1.1 200 OK\nContent-Type: text/html;charset=utf-8\nPower: Python web\nAuther: yagas\n\n"
                        body += "<h1>简易的WEB SERVER实例</h1>"
                        conn.sendall(body)
                        conn.close()

if __name__ == "__main__":
        server = httpd("0.0.0.0",80)
        server.start()

我们通过浏览器进行访问的时候,可以看到”简易的WEB SERVER实例”的页面,并记录下了访问的时候接收到的报头数据,如下:

GET / HTTP/1.1
Host: localhost
Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.81 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8

GET /favicon.ico HTTP/1.1
Host: localhost
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.81 Safari/537.36
Accept: */*
Referer: http://localhost/
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8

主要信息是头一行:

GET / HTML1.1
GET /favicon.ico HTTP/1.1

请求的方式,请求地址,请求的协议。还有一些浏览器发送的来源主机,浏览器信息,语言信息,缓存信息等等。
服务器在接收到请并进行处理,之后同样以报头的形式返回数据,完成一次数据请求与响应。

HTTP/1.1 200 OK
Content-Type:text/html;Charset=utf-8

数据主体信息

响应信息的报送结构是:响应协议 状态 OK,空一行,然后是输出html内容
当我们了解了这一些信息之后,只要针对请求的地址,返回相应的数据,无论是使用什么编程语言,ruby, perl, C, go我们都可以实现一个简易的WEB服务器。
可以把这个简易的web服务器嵌入到某个系统服务中,为用户提供WEB界面进行管理,例如路由器的管理界面等等。
这里只是为大家提供了一个思路。技术的东西,就看你是怎么个用法了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yagas

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值