python实现简单的http服务器_python实现简单http服务器

这个程序相比上面的数据多了一个对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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值