web-静态服务器

最近学习了使用基于HTTP协议的协程版的web静态服务器的搭建,这里简单记录下搭建的流程,代码如下:

# -*- coding:utf-8 -*-

from gevent import monkey; monkey.patch_all() #打补丁
import socket,gevent


class WebServer(object):
    def __init__(self):
        self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

        self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)

        self.server_socket.bind(('', 8888))

        self.server_socket.listen(128)

    def startup(self):
        #监听多个客户端
        while True:
            new_sock, addr = self.server_socket.accept()
            #使用协程实现
            gevent.spawn(self.handle_client, new_sock)

        self.server_socket.close()


    def handle_client(self,new_sock):
        rev_data = new_sock.recv(4096)
        if rev_data:
            # print("接受到的数据是:%s" % rev_data.decode('utf-8'))
            rev_list = rev_data.decode('utf-8').splitlines()
            file_path = rev_list[0].split(' ')[1]

            if file_path == '/':
                file_name = './html/index.html'
            else:
                file_name = './html'+file_path

            try:
                res_line = 'HTTP/1.1 200 OK\r\n'
                res_headers = 'Connection: Keep-Alive\r\n'
                res_headers += 'Content-Type: text/html; charset=utf-8\r\n\r\n'
                f_read = open(file_name, 'rb')
            except Exception:
                res_line = 'HTTP/1.1 404 Not Found\r\n'
                res_headers = 'Connection: Keep-Alive\r\n'
                res_headers += 'Content-Type: text/html; charset=utf-8\r\n\r\n'
                f_read = open('./html/404.html', 'rb')
                content = f_read.read()
                f_read.close()
            else:
                content = f_read.read()
                f_read.close()
            finally:
                new_sock.send((res_line + res_headers).encode('utf-8') + content)

        else:
            print('已和客户端断开连接!!')

        new_sock.close()

def main():
    '''程序的主入口'''
    # 创建一个web服务器对象
    web_server = WebServer()
    # 启动这个服务器
    web_server.startup()

if __name__ == '__main__':
    main()
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,102评论 25 709
  • 搭建web静态服务器 创建项目根目录(或者从github仓库clone)并创建node项目 初始化 执行此步骤前提...
    风之帆阅读 780评论 0 3
  • 神在中心 把自己放在中心 自己变成了神 神在最高 把自己放得最高 自己变成了神 神注视一切 自认为无所不知 自己变...
    禾茉阅读 202评论 0 0
  • 夜微凉,谁彷徨, 月下独酌帝何方? 相思苦,终身怨, 奈何无知残花伤! 晨昏醒,竟尚光, 梦中身...
    红尘客袅袅阅读 405评论 0 3
  • 昨天语文字词测验,小马复习得很认真,但在全对的名单上我没有看到她。 错一个两个对她来说也是常事儿,但放学跟同学往家...
    鸽子1007阅读 164评论 0 0