简单易懂:Python的socket编程模拟Http服务器与浏览器交互

朴灿烈づ我的快乐病毒、 2023-09-24 13:21 75阅读 0赞

本实例是使用Python的Socket编程模拟http服务器与本地浏览器进行交互,浏览器请求一个文件,如果存在则响应浏览器文件内容,否则返回404!
404

文章目录

  • 1、引入socket、re、Threading包
  • 2、使用socket
  • 3、创建实现方法
    • 1、编写实现方法,并引入参数
    • 2、获取报文
    • 3、处理请求头
    • 4、判断请求文件
  • 4、实例结果
      • 1、请求文件成功:
      • 2、请求失败:
  • 5、完整代码:

1、引入socket、re、Threading包

因为将通过多线程来实现服务器与浏览器不间断的交互,以及对于浏览器报文的字符串处理

  1. import socket
  2. import threading
  3. import re

2、使用socket

使用socket对本地IP、端口进行绑定和监听,并且启用多线程

  1. def main():
  2. s = socket.socket()
  3. host = '127.0.0.1'
  4. port = 8866
  5. s.bind((host, port))
  6. s.listen(60)
  7. while True:
  8. con, address = s.accept()
  9. t = threading.Thread(target=Link_Handler, args=(con, address))
  10. t.start()

3、创建实现方法

1、编写实现方法,并引入参数

  1. def Link_Handler(Link, Client):
  2. print("Start to receive messgae from[%s:%s]...\n" % (Client[0], Client[1]))
  3. while True:
  4. Client_data = Link.recv(1024)
  5. print("Message from[%s:%s]:\n%s " % (Client[0], Client[1], Client_data.decode()))

2、获取报文

服务器将接受来自不同客户端的信息,在浏览器中则是接受相关报文

在这里插入图片描述获取报文成功

3、处理请求头

首先需要将报文切割成行,再获取其中请求头,通过编写一个简单的截取字符串的规则来获得请求文件!

  1. RequestLines=Client_data.splitlines()#将报文切割分行
  2. Request_MethodLine=str(RequestLines[0])#获取第一个请求头
  3. rule=re.compile(r'/(.*?) HTTP')#创建切割字符串方法
  4. RequestFileName=re.findall(rule,Request_MethodLine)#获取请求文件名

方法解释如下:文件名的截取

4、判断请求文件

1、如果请求不为空,则响应浏览器该文件名称及内容 2、如果文件为空则响应404,并结束通信

4、实例结果

1、请求文件成功:

在这里插入图片描述

2、请求失败:

在这里插入图片描述

5、完整代码:

  1. import socket
  2. import threading
  3. import re
  4. def Link_Handler(Link, Client):
  5. print("Start to receive messgae from[%s:%s]...\n" % (Client[0], Client[1]))
  6. while True:
  7. Client_data = Link.recv(1024)
  8. print("Message from[%s:%s]:\n%s " % (Client[0], Client[1], Client_data.decode()))
  9. RequestLines=Client_data.splitlines()#将报文切割分行
  10. Request_MethodLine=str(RequestLines[0])#获取第一个请求头
  11. rule=re.compile(r'/(.*?) HTTP')#创建切割字符串方法
  12. RequestFileName=re.findall(rule,Request_MethodLine)#获取请求文件名
  13. if Client_data:
  14. if RequestFileName[0]:
  15. data_line = "HTTP/1.1 200 OK\r\n"
  16. data_blank = "\r\n"
  17. data_body="<div style='color:red; font-size:60px'>The File "+str(RequestFileName[0])+" Is Here!</div>"
  18. else:
  19. data_line = "HTTP/1.1 404 not found\r\n"
  20. data_blank = "\r\n"
  21. data_body = "<div style='color:red; font-size:60px;'> 404 Not Found!</div>"
  22. Message = data_line + data_blank + data_body
  23. Link.sendall(Message.encode())
  24. Link.close()
  25. print("Connect is discard!")
  26. def main():
  27. s = socket.socket()
  28. host = '127.0.0.1'
  29. port = 8800
  30. s.bind((host, port))
  31. s.listen(60)
  32. while True:
  33. con, address = s.accept()
  34. t = threading.Thread(target=Link_Handler, args=(con, address))
  35. t.start()
  36. if __name__=='__main__':
  37. main()

欢迎关注点赞!!!!
码字不易!!点个赞再走!!

发表评论

表情:
评论列表 (有 0 条评论,75人围观)

还没有评论,来说两句吧...

相关阅读