简单易懂:Python的socket编程模拟Http服务器与浏览器交互
本实例是使用Python的Socket编程模拟http服务器与本地浏览器进行交互,浏览器请求一个文件,如果存在则响应浏览器文件内容,否则返回404!
文章目录
- 1、引入socket、re、Threading包
- 2、使用socket
- 3、创建实现方法
- 1、编写实现方法,并引入参数
- 2、获取报文
- 3、处理请求头
- 4、判断请求文件
- 4、实例结果
- 1、请求文件成功:
- 2、请求失败:
- 5、完整代码:
1、引入socket、re、Threading包
因为将通过多线程来实现服务器与浏览器不间断的交互,以及对于浏览器报文的字符串处理
import socket
import threading
import re
2、使用socket
使用socket对本地IP、端口进行绑定和监听,并且启用多线程
def main():
s = socket.socket()
host = '127.0.0.1'
port = 8866
s.bind((host, port))
s.listen(60)
while True:
con, address = s.accept()
t = threading.Thread(target=Link_Handler, args=(con, address))
t.start()
3、创建实现方法
1、编写实现方法,并引入参数
def Link_Handler(Link, Client):
print("Start to receive messgae from[%s:%s]...\n" % (Client[0], Client[1]))
while True:
Client_data = Link.recv(1024)
print("Message from[%s:%s]:\n%s " % (Client[0], Client[1], Client_data.decode()))
2、获取报文
服务器将接受来自不同客户端的信息,在浏览器中则是接受相关报文
获取报文成功!
3、处理请求头
首先需要将报文切割成行,再获取其中请求头,通过编写一个简单的截取字符串的规则来获得请求文件!
RequestLines=Client_data.splitlines()#将报文切割分行
Request_MethodLine=str(RequestLines[0])#获取第一个请求头
rule=re.compile(r'/(.*?) HTTP')#创建切割字符串方法
RequestFileName=re.findall(rule,Request_MethodLine)#获取请求文件名
方法解释如下:
4、判断请求文件
1、如果请求不为空,则响应浏览器该文件名称及内容 2、如果文件为空则响应404,并结束通信
4、实例结果
1、请求文件成功:
2、请求失败:
5、完整代码:
import socket
import threading
import re
def Link_Handler(Link, Client):
print("Start to receive messgae from[%s:%s]...\n" % (Client[0], Client[1]))
while True:
Client_data = Link.recv(1024)
print("Message from[%s:%s]:\n%s " % (Client[0], Client[1], Client_data.decode()))
RequestLines=Client_data.splitlines()#将报文切割分行
Request_MethodLine=str(RequestLines[0])#获取第一个请求头
rule=re.compile(r'/(.*?) HTTP')#创建切割字符串方法
RequestFileName=re.findall(rule,Request_MethodLine)#获取请求文件名
if Client_data:
if RequestFileName[0]:
data_line = "HTTP/1.1 200 OK\r\n"
data_blank = "\r\n"
data_body="<div style='color:red; font-size:60px'>The File "+str(RequestFileName[0])+" Is Here!</div>"
else:
data_line = "HTTP/1.1 404 not found\r\n"
data_blank = "\r\n"
data_body = "<div style='color:red; font-size:60px;'> 404 Not Found!</div>"
Message = data_line + data_blank + data_body
Link.sendall(Message.encode())
Link.close()
print("Connect is discard!")
def main():
s = socket.socket()
host = '127.0.0.1'
port = 8800
s.bind((host, port))
s.listen(60)
while True:
con, address = s.accept()
t = threading.Thread(target=Link_Handler, args=(con, address))
t.start()
if __name__=='__main__':
main()
欢迎关注点赞!!!!
码字不易!!点个赞再走!!
还没有评论,来说两句吧...