资讯专栏INFORMATION COLUMN

python实现web服务器

3fuyu / 2863人阅读

摘要:刚好看了一下,就想着用实现一下服务器的过程。创建,监听端口可以自设解析协议中的获取你想要的参数通过获取的参数取服务器上找到相应的静态资源这里只说静态资源,动态的下一篇再说组织协议的通过端口返回给客服端

本想写一篇关于http->nginx->php这个过程中数据是怎么传输的文章,想了半天,实在没有心情去写。刚好看了一下python,就想着用python实现一下web服务器的过程。这个很简单,目前只支持静态文件的加载,动态语言就要接入fastcgi了(目前还在看fastcgi,下一版本更新吧)。以前没写过python也是边写边查,好多东西用的不是特别好,还有,可以在这个基础上改动,可以支持access.log,多server配置。这里就不写了。

其实过程很简单,nginx大体也是这个逻辑(但是,nginx内部就复杂多了)。

创建socket,监听80端口(可以自设)

解析http协议中的request(获取你想要的参数)

通过获取的参数取服务器上找到相应的静态资源(这里只说静态资源,动态的下一篇再说)

组织http协议的response

通过80端口返回给客服端

#/usr/bin/python
import socket
import sys
import os
from thread import *

HOST = "";PORT = 8887

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print "Socket created"

try:
    s.bind((HOST, PORT))
except socket.error , msg:
    print "Bind failed. Error Code : " + str(msg[0]) + " Message " + msg[1]
    sys.exit()

print "Socket bind complete"

s.listen(10)

print "Socket now listening"

def assces_log(request):
    fp = open("http.log", "aw")
    fp.write(request+"
")
    fp.close()

def parse_request(request):
    request = request.splitlines()
    line = request[0]
    line = line.split();
    dict_request = {"method":line[0], "path":line[1], "version":line[2]}
    return dict_request

while True:
    conn, addr = s.accept()
    request = conn.recv(1024)
    print request
    print "
"

    dist_request = parse_request(request)
    path = dist_request["path"]
    path = os.getcwd() + path

    if os.path.isfile(path):
        if os.path.exists(path):
            fp = open(path, "r")
            reply = fp.read()
            fp.close()
            response_errno = 200
            response_msg = "OK"
        else:
            reply = "Not found page"
            response_errno = 404
            response_msg = "Not found"
    else:
        reply = "Forbidden"
        response_errno = 403
        response_msg = "Forbidden"

    response = "HTTP/1.1 " + str(response_errno) + " " + response_msg + "
"
    response += "
"
    response += reply
    print response

    assces_log(request)

    conn.sendall(response)
    conn.close()

s.close()


文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/37757.html

相关文章

  • python 和 ruby的对比

    摘要:的解析器实现更成熟,第三方库质量高解析器尽管已经有了很大的性能提升和很多新的功能,但是从源代码实现的角度来说,基本上是通过在源代码上打来增加功能的。相对而言,解析器更成熟,也比较稳定。 最近在考虑学习一门后端语言,在ruby和python直接犹豫,然后自己做了一些对比,希望能帮到有同样问题的你。 一、异同对比选择1、Python和ruby的相同点: 都强调语法简单,都具有更一般的表达...

    ghnor 评论0 收藏0
  • Java Python 和Nodejs在web开发方面的简单比较

    摘要:在做数据分析和人工智能方面也有很多可以直接使用的算法库。各方面都能找到优秀的组件。但开发起来复杂一些,更适合有一定规模的团队采用。 对语言之间优势这个问题,可以写几本书来具体阐述. 我尝试简单地说一点。不见得对,也不可能完整,仅供参考。 互联网兴起,静态页面不能满足复杂的交互需求. 出现了动态技术.史前时期动态Web 开发多采用CGI 技术来实现. CGI 将脚本作为单独的进程运行, ...

    Riddler 评论0 收藏0
  • Java Python 和Nodejs在web开发方面的简单比较

    摘要:在做数据分析和人工智能方面也有很多可以直接使用的算法库。各方面都能找到优秀的组件。但开发起来复杂一些,更适合有一定规模的团队采用。 对语言之间优势这个问题,可以写几本书来具体阐述. 我尝试简单地说一点。不见得对,也不可能完整,仅供参考。 互联网兴起,静态页面不能满足复杂的交互需求. 出现了动态技术.史前时期动态Web 开发多采用CGI 技术来实现. CGI 将脚本作为单独的进程运行, ...

    Amio 评论0 收藏0
  • [零基础学python]python开发框架

    摘要:软件开发者通常依据特定的框架实现更为复杂的商业运用和业务逻辑。所有,做开发,要用一个框架。的性能是相当优异的,因为它师徒解决一个被称之为问题,就是处理大于或等于一万的并发。 One does not live by bread alone,but by every word that comes from the mouth of God --(MATTHEW4:4) 不...

    lucas 评论0 收藏0
  • 小型的编程项目有哪些值得推荐?这本神书写了 22 个,个个了不得

    摘要:电子表格使用语言电子表格是办公软件的必备,我们最熟知的是微软的。文中用框架来实现一个简单的电子表格,所用代码仅行。 showImg(https://segmentfault.com/img/remote/1460000019770011); 本文原创并首发于公众号【Python猫】,未经授权,请勿转载。 原文地址:https://mp.weixin.qq.com/s/Ob... 今天,...

    haitiancoder 评论0 收藏0

发表评论

0条评论

3fuyu

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<