这个程序相比上面的数据多了一个对url的判断而已。
这次我们用一个html文件来尝试。
我们在一个文件夹下创建一个txt文件,写上这样一段代码:
index我是登陆页面
将后缀名txt修改成html。
再创建一个create.html页面。只需要把里面的代码修改成:
create我是注册页面
接下来来写我们的python代码。
import socket
import re
def dump_data(cli_socket):
# 接收到的是bytes类型,我们解码
recv_data = cli_socket.recv(1024).decode('utf-8')
# 将我们接收到的数据以空格切开变成一个列表,便于我们取值,判断请求的那个页面
recv_data_lines = recv_data.splitlines()
print(recv_data_lines)
# 正则提取浏览器需要的页面
# 数据:GET /index.html HTTP/1.1
# 或者:POST /index.html HTTP/1.1 或者其他请求方式
f_name = re.match(r'[^/]+(/[^ ]*)',recv_data_lines[0])
resp_data = 'HTTP/1.1 200 OK\r\n'
resp_data += '\r\n'
# body部分
# 读取文件
file = open('F:'+f_name.group(1),'rb')
html_con = file.read()
file.close()
# 由于我们读取文件是以二进制的方式读取,所以不能直接相加
cli_socket.send(resp_data.encode('utf-8'))
# 分开发送就好了
cli_socket.send(html_con)
cli_socket.close()
def main():
tcp_server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
tcp_server.bind(("",7891))
tcp_server.listen(128)
print('等待')
while True:
cli_socket,cli_addr = tcp_server.accept()
dump_data(cli_socket)
tcp_server.close()
if __name__ == "__main__":
main()
运行一下,提示我们没有favicon.ico文件(图标),我们创建一个就好了(直接文本创建该名字就好了,后缀也需要修改的)
接下来运行,我们在浏览器输入127.0.0.1:7891/index.html 页面就会显示我是登陆页面,输入127.0.0.1:7891/create.html就会显示我是注册页面,当然如果找不到文件你可以试着添加一个404页面。或者返回为HTTP/1.1 404 NOT FOUND。
完整版:
import socket
import re
def dump_data(cli_socket):
recv_data = cli_socket.recv(1024).decode('utf-8')
recv_data_lines = recv_data.splitlines()
print(recv_data_lines)
ret = re.match(r'[^/]+(/[^ ]*)',recv_data_lines[0])
if ret:
f_name = ret.group(1)
if f_name=="/":
f_name = '/index.html'
try:
file = open('F:'+f_name,'rb')
except:
resp_data = 'HTTP/1.1 404 NOT FOUND\r\n'
resp_data += '\r\n'
resp_data += '404'
cli_socket.send(resp_data.encode('utf-8'))
else:
html_con = file.read()
file.close()
resp_data = 'HTTP/1.1 200 OK\r\n'
resp_data += '\r\n'
cli_socket.send(resp_data.encode('utf-8'))
cli_socket.send(html_con)
cli_socket.close()
def main():
tcp_server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
tcp_server.bind(("",7891))
tcp_server.listen(128)
print('等待')
while True:
cli_socket,cli_addr = tcp_server.accept()
dump_data(cli_socket)
tcp_server.close()
if __name__ == "__main__":
main()