非阻塞web静态服务器

单进程但链接非阻塞web静态服务器

"""
@author: Bre Athy
@contact: https://www.zhihu.com/people/you-yi-shi-de-hu-xi
@productware: PyCharm
@file: 单进程但链接非阻塞web静态服务器.py
@time: 2019/11/9 5:33
"""
import socket,re


def service_client(new_socket,recv_data):
    path = r"E:\__init__\Downloads\Compressed\mikutap (2)"
    ret = re.match(r"GET (.*?) H", recv_data)
    if not ret:
        print("客户端连接已断开")
    else:
        if ret.group(1) == r"/":
            path += r"\index.html"
        else:
            path += ret.group(1).replace("/", "\\")
    # 准备应答内容
    try:
        response_headers = bytes("HTTP/1.1 200 OK\r\n", encoding='gbk')
        with open(path, "rb")as fp:
            response_body = fp.read()
    except:
        response_body = bytes("<h1>页面不在了哟<h1>", encoding='gbk')
        response_headers = bytes("HTTP/1.1 404 NotFound\r\n", encoding='gbk')
    response_headers+=(("Content-Length:%d\r\n"%len(response_body)+"\r\n").encode("gbk"))
    new_socket.send(response_headers+response_body)



def main():
    # 创建套接字并绑定
    tcp_server_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    tcp_server_socket.bind(("",7788))
    # 准备监听
    tcp_server_socket.listen(128)
    # 套接字非堵塞,如果没有连接就会报异常
    tcp_server_socket.setblocking(False)

    # 存储客户端连接套接字的列表
    client_socket_list=[]
    while True:
        try:
            # 等待客户端连接
            new_socket,addr=tcp_server_socket.accept()
        except Exception as ret:
            pass
        else:
            # 收到的客户端套接字也要设置非堵塞
            new_socket.setblocking(False)
            # 存储到列表
            client_socket_list.append(new_socket)

        # 遍历列表
        for client_socket in client_socket_list:
            # 数据没收到会报出异常
            try:
                recv_data=client_socket.recv(1024)
            except Exception as ret:
                pass
            else:
                # 有返回值,但返回值为空,这是关闭连接的信号
                if recv_data:
                    recv_data=recv_data.decode("gbk")
                    service_client(client_socket,recv_data)
                else:
                    client_socket.close()
                    client_socket_list.remove(client_socket)
        # 为客户端服务


if __name__ == "__main__":
    main()
Web.Java是一个高性能,轻量级的非阻塞服务器。 为了能更好的提高性能,Web.Java把HTTP服务区分应用和文件服务两种。 Web.Java 整体采用Reactor模式用来接收或响应HTTP请求(原理同Nginx)。 应用服务采用了Reactor来响应请求。 文件服务采用了Proactor模式,并搭配304状态使用,能极大的提高静态文件的相应速度,且不影响整体。 模板引擎 简单的标签:只需要记住{{}}标签用于输出变量,{%%}标签用于if,for 等操作。 可以继承的模版:页面的布局,HTML文件的复用等问题,通过模版继承机制可以得到解决。用{%extends xx%}关键字实现继承。 高性能:Web.Java会自动把Html文件,编译成Java文件。应用到生产环境的时候,速度等同于Java的硬输出。且在DEBUG模式下,会动态的加载模板文件,而不需要重启进程。 灵活漂亮的URL 随便打开几个J2EE的网站,我就不想吐槽那个URL了。Web.Java使用正则表达式来配置URL,这样做可以提供足够强大和灵活的URL模式。比如像用“/Article/23”想获取文章的ID可以这样来配置URL HttpServer.setPATH("/Article/(\\d )",new ArticleHandler());   //ArticleHandler.java文件 get方法 public void get(String id){     //获取ID进行其他操作   ……   } 这样在ArticleHandler中对应的get或者post方法中就会获取相应的参数。当然,你可以任意的使用正则表达式来配置你的URL 简单易用的数据库操作 Options.DBURL = "jdbc:mysql://localhost:3306/test"; Options.DBDriver = "com.mysql.jdbc.Driver"; Options.DBUser = "root"; Options.DBPassword = "123456"; 配置好数据库信息后,可以直接在Handler中使用DB中的静态方法进行操作。 具体的操作在DB中有说明。当然如果你想,可以使用任何你想用的ORM。当然,希望你能直接使用SQL,不想解释为什么。 Hello World! 看名字就知道了。让我们开始使用Web.Java吧! 把源码包放到你的项目目录下面。 然后在main方法中加入 HttpServer.setPATH("/", new IndexHandler()); System.out.println("Listen 8080"); HttpServer.init(8080); IndexHandler.java public void get() {     this.writer("Hello World!"); } 现在Run it 浏览器打开就会看到你Writer的内容了。 标签:WebJava
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值