美文网首页
03-web服务器v3.1--02

03-web服务器v3.1--02

作者: 努力爬行中的蜗牛 | 来源:发表于2018-11-09 13:10 被阅读0次
返回固定页面的Http服务器
import socket


def service_client(new_socket):
    """为这个客户端返回数据"""
    # 1. 接收浏览器发送过来的请求,即http请求
    # GET / HTTP 1.1
    request = new_socket.recvfrom(1024)
    print(request)

    # 2. 返回http格式的数据,给浏览器
    # 2.1 准备发送给浏览器的数据---header
    response = "HTTP/1.1 200 OK\r\n"  # 换行
    response += "\r\n"
    # 2.2 准备发送给浏览器的数据---body
    response += "<h1>hello world</h1>"
    new_socket.send(response.encode("utf-8"))

    # 3. 关闭套接字
    new_socket.close()

def main():
    # 1. 创建套接字
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 设置当服务器先close 即服务器端4次挥手之后资源能够立即释放,这样就保证了下次运行的时候可以立即使用这个地址
    tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
    # 2. 绑定
    tcp_server_socket.bind(("127.0.0.1", 7890))
    # 3. 变为监听套接字
    tcp_server_socket.listen(128)
    # 4. 等待新客户的链接
    new_socket, client_addr = tcp_server_socket.accept()
    # 5. 为这个客户端服务
    service_client(new_socket)


if __name__ == '__main__':
    main()
tcp的3次握手和4次挥手
3次握手.png
4次挥手.png
Http服务器返回客户端相应网页
import socket
import re


def service_client(new_socket):
    """为这个客户端返回数据"""
    # 1. 接收浏览器发送过来的请求,即http请求
    # GET / HTTP 1.1
    request = new_socket.recv(1024).decode("utf-8 ")
    # print(">" * 50)
    # print(request)

    requet_lines = request.splitlines()
    print("")
    print(">" * 20)
    print(requet_lines)

    # GET /index.html HTTP/1.1
    file_name = ""
    # [ ]的^ 表示取反 即不是/ 不是空格
    ret = re.match(r"[^/]+(/[^ ]*)", requet_lines[0])
    print("-" * 100)
    print(ret)
    print("-" * 100)
    if ret:
        file_name = ret.group(1)
        # print("*" * 50, file_name)
        if file_name == "/":
            file_name = "/index.html"

    try:
        f = open("./html" + file_name, "rb")
    except:
        response = "HTTP/1.1 404 NOT FOUND\r\n"  # 换行
        response += "\r\n"
        response += "---file not found---"
        new_socket.send(response.encode("utf-8"))
    else:
        html_content = f.read()
        f.close()
        # 2. 返回http格式的数据,给浏览器
        # 2.1 准备发送给浏览器的数据---header
        response = "HTTP/1.1 200 OK\r\n"  # 换行
        response += "\r\n"
        # 2.2 准备发送给浏览器的数据---body
        # response += "<h1>hello world</h1>"
        # new_socket.send(response.encode("utf-8"))
        # 将response header发送给浏览器
        new_socket.send(response.encode("utf-8"))
        # 将response body发送给浏览器
        new_socket.send(html_content)

    # 3. 关闭套接字
    new_socket.close()


def main():
    # 1. 创建套接字
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 设置当服务器先close 即服务器端4次挥手之后资源能够立即释放,这样就保证了下次运行的时候可以立即使用这个地址
    tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
    # 2. 绑定
    tcp_server_socket.bind(("127.0.0.1", 7890))
    # 3. 变为监听套接字
    tcp_server_socket.listen(128)
    while True:
        # 4. 等待新客户的链接
        new_socket, client_addr = tcp_server_socket.accept()
        # 5. 为这个客户端服务
        service_client(new_socket)


if __name__ == '__main__':
    main()

相关文章

  • 03-web服务器v3.1--02

    返回固定页面的Http服务器 tcp的3次握手和4次挥手 Http服务器返回客户端相应网页

  • 03-web服务器v3.1--01

    正则表达式 1.匹配单个字符 匹配多个字符 匹配开头结尾 邮箱正则 匹配分组 re的高级用法 search、fin...

  • 03-web服务器v3.1--03

    多进程、多线程实现Http服务器 使用gevent实现Http服务器开启多任务 单进程、线程、非堵塞实现并发 长链...

  • 服务器硬件了解

    常见服务器品牌包括: IBM服务器、Dell服务器、HP服务器、浪潮服务器、华为服务器。 服务器硬件组成: 服务器...

  • 服务器和客户端

    服务器相关知识 服务器 服务器概念:能够提供某种服务的机器被称为服务器 服务器分类 服务器类型 文件服务器:向客...

  • 19

    服务器刀片服务器(电脑)不同的服务器需求是不一样的。服务器机器:服务器被攻击了,买了一台服务器。服务器挂了。服务器...

  • pomelo学习

    1,gate服务器 connector服务器 game服务器connector服务器和gate服务器间通过r...

  • MySql配置主主复制

    服务器A:192.168.99.24服务器B:10.255.255.24 服务器A mysql配置 服务器B my...

  • ajax

    1. 服务器 刀片服务器(电脑)不同的服务器需求是不一样的。服务器机器:服务器被攻击了,买了一台服务器。服务器挂了...

  • 2018-10-26

    1. 服务器 刀片服务器(电脑)不同的服务器需求是不一样的。服务器机器:服务器被攻击了,买了一台服务器。服务器挂了...

网友评论

      本文标题:03-web服务器v3.1--02

      本文链接:https://www.haomeiwen.com/subject/asygxqtx.html