因为网络间通信是基于TCP协议传输数据的,而服务器与浏览器之间通信是基于HTTP协议的,那么下面基于python实现一个tcp服务器,浏览器可以基于http协议进行发送请求和解析。浏览器展示返回的一个标准的HTML网页,此外实现服务器解析客户端多次请求并且返回请求结果。即:客户端根据HTML里面的各种链接,再发送HTTP请求给服务器,拿到相应的图片、视频、Flash、JavaScript脚本、CSS等各种资源,最终显示出一个完整的页面。

1.代码实现web服务器,实现解析用户请求并且返回对应结果

#coding=utf-8
import socket
import redef handle_client(client_socket):"为一个客户端进行服务"recv_data = client_socket.recv(1024).decode('gbk', errors="ignore") #报错忽略'''注意尽管客户端可以根据返回的HTML里的链接发送二次请求,但是要想正确返回请求内容,需要服务器能够解析这些请求内容,找到这些内容读取后send给客户端。所以下面要做的就是解析客户端的请求如下格式:b'GET /images/qt-logo.png HTTP/1.1\r\nHost: 127.0.0.1:7890\r\nConnection: keep-alive\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.80 Safari/537.36\r\nAccept: image/webp,image/apng,image/*,*/*;q=0.8\r\nReferer: http://127.0.0.1:7890/\r\nAccept-Encoding: gzip, deflate, br\r\nAccept-Language: zh-CN,zh;q=0.9\r\n\r\n''''request_header_lines = recv_data.splitlines() #1.将服务器接收的数据按HTTP格式进行切分,模式分割符就是\r\nfor line in request_header_lines:   #打印是为了测试使用print(line)http_request_line = request_header_lines[0]  #2.获取请求数据的第一行,比如:GET /images/qt-logo.png HTTP/1.1get_file_name = re.match("[^/]+(/[^ ]*)", http_request_line).group(1)  #3.获取客户端请求的文件名images/qt-logo.pngprint("file name is ===>%s" % get_file_name)  # for test# 如果没有指定访问哪个页面。例如index.html# GET / HTTP/1.1if get_file_name == "/":get_file_name = DOCUMENTS_ROOT + "/index.html"else:get_file_name = DOCUMENTS_ROOT + get_file_nameprint("file name is ===2>%s" % get_file_name) #for testtry:f = open(get_file_name, "rb")except IOError: #如果没有该文件,则返回404 not found# 404表示没有这个页面response_headers = "HTTP/1.1 404 not found\r\n"response_headers += "\r\n"response_body = "====sorry ,file not found===="else:  #注意这里else的使用,找到了该文件返回200 OKresponse_headers = "HTTP/1.1 200 OK\r\n"response_headers += "\r\n"response_body = f.read() #读取用户请求的文件,注意这里如果文件很大,可以循环读取f.close()finally:# 在这里将读取的文件发送给客户端。# 因为头信息在组织的时候,是按照字符串组织的,不能与以二进制打开文件读取的数据合并,因此分开发送# 先发送response的头信息client_socket.send(response_headers.encode('gbk')) #注意如果在linux上测试的话,改成utf-8# 再发送bodyclient_socket.send(response_body)client_socket.close()def main():"作为程序的主控制入口"server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 设置当服务器先close 即服务器端4次挥手之后资源能够立即释放,这样就保证了,下次运行程序时 可以立即绑定7788端口server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)server_socket.bind(("", 7788))server_socket.listen(128)while True:client_socket, clien_cAddr = server_socket.accept()handle_client(client_socket)#这里配置服务器
DOCUMENTS_ROOT = "./html"  #因为文件都放在当前路径下的html文件夹里,所以这里定义一个固定路径,存放的是提前写好的网页文件。if __name__ == "__main__":main()

2.测试展示与分析

       启动上面程序,打开web浏览器,访问该服务器。注意,之前我们服务器是固定返回一个页面给浏览器,不去对请求的数据进行解析处理,所以192.168.1.1:7788后面跟任何字符串都行,都不会报错,现在则不行,服务器会对浏览器的请求进行解析,如下因为找不到/aaaa/bbbb/ccc而报错,404 NOT FOUND

2.1错误访问地址

  2.2.正常向服务器发送请求

     所以这个时候我们就需要按服务器上的正常部署是文件去访问了.比如我们在服务器上配置默认的路径就是index.html,所以我们直接用浏览器访问http://192.168.1.1:7788/index.html 或者http://192.168.1.1:7788结果都是一样,如下,注意下面网页的图片已经加载正常了。实现了客户端根据HTML里面的各种链接,再发送HTTP请求给服务器,拿到相应的图片、视频、Flash、JavaScript脚本、CSS等各种资源,最终显示出一个完整的页面

2.3服务器内部打印的浏览器请求与解析后的结果如下: 

  可以看出虽然请求了一次,但是浏览器因为网页内嵌的url,随后发送了多次请求,并且都得到了正确响应。

GET / HTTP/1.1
Host: 192.168.1.1:7788
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.80 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9file name is ===>/
file name is ===2>./html/index.html
GET /classic.css HTTP/1.1
Host: 192.168.1.1:7788
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.80 Safari/537.36
Accept: text/css,*/*;q=0.1
Referer: http://192.168.1.1:7788/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9file name is ===>/classic.css
file name is ===2>./html/classic.css
GET /images/qt-logo.png HTTP/1.1
Host: 192.168.1.1:7788
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.80 Safari/537.36
Accept: image/webp,image/apng,image/*,*/*;q=0.8
Referer: http://192.168.1.1:7788/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9file name is ===>/images/qt-logo.png
file name is ===2>./html/images/qt-logo.png
GET /images/trolltech-logo.png HTTP/1.1
Host: 192.168.1.1:7788
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.80 Safari/537.36
Accept: image/webp,image/apng,image/*,*/*;q=0.8
Referer: http://192.168.1.1:7788/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9file name is ===>/images/trolltech-logo.png
file name is ===2>./html/images/trolltech-logo.png

python实现外部静态服务器,浏览器通过HTTP与之通信2相关推荐

  1. python实现外部静态服务器,浏览器通过HTTP与之通信1

        因为网络间通信是基于TCP协议传输数据的,而服务器与浏览器之间通信是基于HTTP协议的,那么下面基于python实现一个tcp服务器,浏览器可以基于http协议进行发送请求和解析.展示浏览器返 ...

  2. pythonweb静态服务器_python实现外部静态服务器,浏览器通过HTTP与之通信2

    python实现外部静态服务器,浏览器通过HTTP与之通信2 发布时间:2019-07-10 14:29, 浏览次数:117 , 标签: python HTTP 因为网络间通信是基于TCP协议传输数据 ...

  3. Python简易web静态服务器程序搭建

    Python简易web静态服务器程序搭建 Python自带简易静态web服务器搭建 http.server模块 DIY简易静态web服务器程序搭建 普通版 步骤 具体代码 面向对象版 代码 命令行版 ...

  4. Python高级——Web静态服务器(面向对象)

    功能:用户访问服务器可以返回指定页面 步骤: 1.创建服务器类 2.创建初始化服务器配置方法 3.创建接收客户端请求的方法 4.创建发送响应报文给客户端方法 import socket import ...

  5. 搭建Python自带静态Web服务器

    学习目标 能够知道搭建Python自带Web服务器 1. 静态Web服务器是什么? 可以为发出请求的浏览器提供静态文档的程序. 平时我们浏览百度新闻数据的时候,每天的新闻数据都会发生变化,那访问的这个 ...

  6. node 创建静态服务器并自动打开浏览器

    node 作为一门偏向后端的技术,提供了可以让我们js 在服务器上运行的平台,为我们前端工程师实现项目前端工程化,带来了众多便利.同时,它也可以很方便的创建静态服务器,可以直接连接数据库...实现多种 ...

  7. 构建静态服务器_为静态网站构建无服务器联系表

    构建静态服务器 介绍 (Introduction) A few years ago AWS launched static hosting service S3, which was a paradi ...

  8. 服务器关闭重启后客户端socket能自动连接吗_用Python 撸一个 Web 服务器

    从一个 Hello World 程序说起 要编写 Web 服务器,需要用到一个 Python 内置库 socket.Socket 是一个比较抽象的概念,中文叫套接字,它代表一个网络连接.两台计算机之间 ...

  9. Python -- 手动搭建HTTP服务器

    目录 1.WSGI接口 2.新建WSGI服务器 3.使用if管理请求路径 4.使用字典管理请求路径 5.使用装饰器管理请求路径 6.requests模块的介绍 演示代码: import reimpor ...

最新文章

  1. 看看那些不讲码德的坏习惯
  2. SignalR 中丰富多彩的消息推送方式
  3. pop3常用命令记录
  4. angularjs 表单校验指令_angular4.0的模板式表单、响应式表单及其错误提示
  5. GIT上fork的项目获取最新源代码
  6. 从上到下打印二叉树的三种题型
  7. Docker配置国内加速镜像源
  8. Vue之webpack之vue
  9. 《Java编程思想》读书笔记-对象导论
  10. 【雷达通信】基于matlab雷达前视成像仿真【含Matlab源码 643期】
  11. KbmMW 4.30.00 发布
  12. PentaLogix ViewMate Pro v11.16.16破解版
  13. 6.9 齐次线性方程组
  14. dl320服务器内存型号,HP DL320 G5 1U XEON 3040/2GB内存/500G SATA 双核服务器
  15. 良心推荐7个实用网站
  16. 联想网上审批系统方案
  17. Python3网络爬虫:腾讯新闻App的广告数据抓取
  18. asp毕业设计—— 基于asp+access的网络招聘管理系统设计与实现(毕业论文+程序源码)——网络招聘管理系统
  19. HIVE 列转行 字段分组截取随笔#collect_list/collect_set
  20. 毕业论文找文献是个问题,我直接用python把全网文献爬了一遍,这波就很舒服

热门文章

  1. Chrome 夜间模式扩展-Change Colors
  2. 配送中心的自动化与智能化(zt)
  3. 2019新年Flag
  4. android服务框架下载,一加移动服务框架
  5. vue前后端aes url传参解密再解base64编码
  6. ArcGIS 实验理论基础二十五 地图符号的制作与应用
  7. 5G基础知识学习(十五)—NSA手机的5G信号是怎么显示的?
  8. JAVA设计模式什么鬼(桥接)——作者:凸凹里歐
  9. 操作系统学习笔记——北京大学陈向群老师课后及习题答案(5)
  10. 学java之前要学_之前学过C#,现在还想学java,一般要学多久时间?