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文件,结果如下:
访问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()