web实质

import socket

server = socket.socket()
server.bind(('127.0.0.1', 9001))
server.listen()

while True:
    conn, _ = server.accept()
    data = conn.recv(1024)
    print(data.decode('utf-8'))
    conn.send(b'HTTP/1.1 200 ok\r\n\r\nhello python') # http的返回格式+返回数据
    # 'HTTP/1.1 200 ok\r\n\r\n'是http的返回格式,返回格式和返回的数据可分开发送
    conn.close()
server.close()

此时,我们在浏览器中输入IP地址和端口(127.0.0.1:9001)就可以看到发送的socket服务端发送过来的数据'hello python'了,截图如下:

网页中显示的内容,一般是存储在文件中,下面我们展示如何把存储在服务器上的文件显示在浏览器页面中。

文件内容如下:

# 文件名:test.txt
God helps those who help themselves.

socket服务端代码如下:

import socket

server = socket.socket()
server.bind(('127.0.0.1', 9001))
server.listen()

while True:
    conn, _ = server.accept()
    data = conn.recv(1024)
    print(data.decode('utf-8'))
    conn.send(b'HTTP/1.1 200 ok\r\n\r\n')
    with open('test.txt', 'rb') as f:
        data = f.read()
    conn.send(data)
    conn.close()
server.close()

浏览器访问后,截图如下:

接下来,我们将展示如何将html文件(html文件也是个文件,因此跟上面将普通文件显示在浏览器中毫无区别)显示在浏览器中

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1 style="color:red">web文件</h1>
<p style="color:green">这是一个简单的html文件,将显示在浏览器中</p>
</body>
</html>

socket服务端代码如下:

import socket

server = socket.socket()
server.bind(('127.0.0.1', 9001))
server.listen()

while True:
    conn, _ = server.accept()
    data = conn.recv(1024)
    print(data.decode('utf-8'))
    conn.send(b'HTTP/1.1 200 ok\r\n\r\n')
    with open('index.html', 'rb') as f:  # 只需要将文件名修改成html文件即可
        data = f.read()
        
    conn.send(data)
    conn.close()
server.close()

运行代码后,打开浏览器,访问结果如下:

在上面的代码中,我们打印了浏览器请求的信息,截图如下:

我们在使用浏览器访问服务器的时候,会看到不同得url路经,不同的url路经将显示不同的页面内容,下面我们将实验使用的一个test.txt文件index.html文件分别显示出来,由于将要显示不同路经下的两个文件,因此我们可以通过if判断进行区别,并将放回的页面信息封装到函数中

import  socket

server = socket.socket()
server.bind(('127.0.0.1', 9001))
server.listen()

def test(conn):
    with open('test.txt', 'rb') as f:
        data = f.read()
    conn.send(data)
    conn.close()

def index(conn):
    with open('index.html', 'rb') as f:
        data = f.read()
    conn.send(data)
    conn.close()

def err():
    err = b'404 not found!'
    conn.send(err)
    conn.close()

while True:
    conn, addr = server.accept()
    from_b_msg = conn.recv(1024)
    str_msg = from_b_msg.decode('utf-8')
    path = str_msg.split('\r\n')[0].split(' ')[1]
    # 将客户端发送的请求信息进行分割,获取到浏览器访问的文件路径,再通过路径判断将用户请求页面返回
    print('path>>>', path)
    conn.send(b'HTTP/1.1 200 ok \r\n\r\n')
    print(from_b_msg)
    if path == '/index.html':
        index(conn)
    elif path == '/test.txt':
        test(conn)
    else:
        err()

访问html文件,结果如下:

扫描二维码关注公众号,回复: 11164861 查看本文章

访问txt文件,结果如下:

访问其他路径地址,则显示错误提示,结果如下:

多线程版的web框架:

import socket
from threading import Thread

server = socket.socket()
server.bind(('127.0.0.1', 9001))
server.listen()

def test(conn):
    with open('test.txt', 'rb') as f:
        data = f.read()
    conn.send(data)
    conn.close()

def index(conn):
    with open('index.html', 'rb') as f:
        data = f.read()
    conn.send(data)
    conn.close()

def err():
    err = b'404 not found!'
    conn.send(err)
    conn.close()

while True:
    conn, addr = server.accept()
    from_b_msg = conn.recv(1024)
    str_msg = from_b_msg.decode('utf-8')
    path = str_msg.split('\r\n')[0].split(' ')[1]
    print('path>>>', path)
    conn.send(b'HTTP/1.1 200 ok \r\n\r\n')
    print(str_msg)
    if path == '/index.html':
        t = Thread(target=index, args=(conn,))
        t.start()
    elif path == '/test.txt':
        t = Thread(target=test, args=(conn,))
        t.start()
    else:
        err()

猜你喜欢

转载自www.cnblogs.com/scaven-01/p/12815629.html