来写一个属于自己的Web服务器(下)

简介: 万维网(英语:World Wide Web),亦作“WWW”、“Web”,是一个透过互联网访问的,由许多互相链接的超文本组成的系统。 —— 维基百科

5

实现显示图片

1、我们在WebServer目录下新建一个名为index.html文件,并写入以下内容:

<html>
<body>
< a href="/pages/">pages</ a>
</body>
</html>

2、然后在WebServer目录下新建一个文件夹pages,并在该目录下新建一个名为index.html的文件,并写入以下内容:

<html>
I like this pic:<br>
<img src="pic.jpg"/>
</html>

3、在pages目录下保存一个jpg格式的图像文件,并将其命名为pic.jpg

4、这一步,我们更新server.py文件为以下内容:

# 导入socket包
import socket
# 服务器IP与端口
HttpPort = 18080
HttpHost = ('localhost', HttpPort)
# 头部信息
HttpHtmlResponseHeader = '''HTTP/1.1 200 OK
Content-Type: text/html;charset=UTF-8
'''
HttpImageResponseHeader = '''HTTP/1.1 200 OK
Content-Type: image/jpg
'''
# Header与Body分隔符
LineSeparator = '\r\n\r\n'
# HTTP响应
HttpResponseBody = ''
# HTTP响应Bytes
HttpResponse = ''.encode(encoding='utf-8')
# 创建基于IPV4 TCP的socket
ServerSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# socket的绑定与监听
ServerSocket.bind(HttpHost)
ServerSocket.listen(100)
print("server is running at http://localhost:%d" % HttpPort)
# 获取HTTP请求报头
def get_headers(request):
    # 分隔符切割
    headers_array = request.split('\r\n')
    # HTTP请求头首行 是请求方法 请求路径 HTTP协议版本
    headers = {}
    for header_item in headers_array[1:]:
        item_ = header_item.split(': ')
        headers[item_[0]] = item_[1]
    return headers
# 获取URL参数
def get_get_args(request_url):
    get_args_arr = request_url[request_url.find('?') + 1:].split('&')
    # print(get_args_arr)
    get_args = {}
    try:
        for get_item in get_args_arr:
            item_ = get_item.split('=')
            get_args[item_[0]] = item_[1]
        return get_args
    except:
        return {}
# 获取POST表单参数
def get_post_args(request_body):
    post_args_arr = request_body.split('&')
    post_args = {}
    for post_item in post_args_arr:
        item_ = post_item.split('=')
        post_args[item_[0]] = item_[1]
    return post_args
# 处理客户端连接
while True:
    Client, Address = ServerSocket.accept()
    # 客户端的HTTP请求
    Request = Client.recv(1024).decode(encoding='utf-8')
    # 将请求分为报头与主体
    RequestText = Request.split(LineSeparator)
    # 报头
    RequestHeader = RequestText[0]
    # 主体
    RequestBody = RequestText[1]
    # 请求方法
    RequestMethod = RequestHeader.split(' ')[0]
    # 请求路径
    RequestUrl = RequestHeader.split(' ')[1].split('?')[0]
    # 请求头部
    RequestHeaders = get_headers(RequestHeader)
    # 响应清空
    HttpResponseBody = ''
    HttpResponse = ''.encode(encoding='utf-8')

5、我们执行 python3 server.py,并打开浏览器输入之前的地址,可以看到以下输出:


32.png


33.png

我们点击pages,可以看到我们的图片也加载出来啦!



34.jpg


不错,我们的服务器工作良好!


6

总结

我们从0实现了一个简单的Web服务器(HTTP服务器),从最开始的只能显示一段文本到解析用户提交的参数与表单,并实现了图片的显示与静态网页文件的加载,有没有感到成就感满满呢?不过我们的服务器还是相当的简陋,期待大家按照自己的想法去对HTTP的其他方法进行实现与扩展:)

自知才疏学浅,如果文章中有错误还请各位读者斧正,如果您觉得本文内容对您有所帮助,可以考虑请我吃包辣条~

相关文章
|
3月前
|
XML 前端开发 JavaScript
PHP与Ajax在Web开发中的交互技术。PHP作为服务器端脚本语言,处理数据和业务逻辑
本文深入探讨了PHP与Ajax在Web开发中的交互技术。PHP作为服务器端脚本语言,处理数据和业务逻辑;Ajax则通过异步请求实现页面无刷新更新。文中详细介绍了两者的工作原理、数据传输格式选择、具体实现方法及实际应用案例,如实时数据更新、表单验证与提交、动态加载内容等。同时,针对跨域问题、数据安全与性能优化提出了建议。总结指出,PHP与Ajax的结合能显著提升Web应用的效率和用户体验。
84 3
|
4月前
|
Java PHP
PHP作为广受青睐的服务器端脚本语言,在Web开发中占据重要地位。理解其垃圾回收机制有助于开发高效稳定的PHP应用。
【10月更文挑战第1天】PHP作为广受青睐的服务器端脚本语言,在Web开发中占据重要地位。其垃圾回收机制包括引用计数与循环垃圾回收,对提升应用性能和稳定性至关重要。本文通过具体案例分析,详细探讨PHP垃圾回收机制的工作原理,特别是如何解决循环引用问题。在PHP 8中,垃圾回收机制得到进一步优化,提高了效率和准确性。理解这些机制有助于开发高效稳定的PHP应用。
66 3
|
6月前
|
API C# 开发框架
WPF与Web服务集成大揭秘:手把手教你调用RESTful API,客户端与服务器端优劣对比全解析!
【8月更文挑战第31天】在现代软件开发中,WPF 和 Web 服务各具特色。WPF 以其出色的界面展示能力受到欢迎,而 Web 服务则凭借跨平台和易维护性在互联网应用中占有一席之地。本文探讨了 WPF 如何通过 HttpClient 类调用 RESTful API,并展示了基于 ASP.NET Core 的 Web 服务如何实现同样的功能。通过对比分析,揭示了两者各自的优缺点:WPF 客户端直接处理数据,减轻服务器负担,但需处理网络异常;Web 服务则能利用服务器端功能如缓存和权限验证,但可能增加服务器负载。希望本文能帮助开发者根据具体需求选择合适的技术方案。
313 0
|
6月前
|
Rust 安全 开发者
惊爆!Xamarin 携手机器学习,开启智能应用新纪元,个性化体验与跨平台优势完美融合大揭秘!
【8月更文挑战第31天】随着互联网的发展,Web应用对性能和安全性要求不断提高。Rust凭借卓越的性能、内存安全及丰富生态,成为构建高性能Web服务器的理想选择。本文通过一个简单示例,展示如何使用Rust和Actix-web框架搭建基本Web服务器,从创建项目到运行服务器全程指导,帮助读者领略Rust在Web后端开发中的强大能力。通过实践,读者可以体验到Rust在性能和安全性方面的优势,以及其在Web开发领域的巨大潜力。
58 0
|
6月前
|
Java 数据库 API
JSF与JPA的史诗级联盟:如何编织数据持久化的华丽织锦,重塑Web应用的荣耀
【8月更文挑战第31天】JavaServer Faces (JSF) 和 Java Persistence API (JPA) 分别是构建Java Web应用的用户界面组件框架和持久化标准。结合使用JSF与JPA,能够打造强大的数据驱动Web应用。首先,通过定义实体类(如`User`)和配置`persistence.xml`来设置JPA环境。然后,在JSF中利用Managed Bean(如`UserBean`)管理业务逻辑,通过`EntityManager`执行数据持久化操作。
77 0
|
6月前
|
JavaScript 搜索推荐 前端开发
从零搭建到部署:Angular与Angular Universal手把手教你实现服务器端渲染(SSR),全面解析及实战指南助你提升Web应用性能与SEO优化效果
【8月更文挑战第31天】服务器端渲染(SSR)是现代Web开发的关键技术,能显著提升SEO效果及首屏加载速度,改善用户体验。Angular Universal作为官方SSR解决方案,允许在服务器端生成静态HTML文件。本文通过具体示例详细介绍如何使用Angular Universal实现SSR,并分享最佳实践。首先需安装Node.js和npm。
176 1
|
6月前
|
Rust 安全 Java
Rust语言在Web后端的应用:基于Actix-web构建高性能、安全可靠的服务器实践
【8月更文挑战第31天】随着互联网的发展,Web应用对性能和安全性要求不断提高。Rust凭借卓越的性能、内存安全及丰富生态,成为构建高性能Web服务器的理想选择。本文通过一个简单示例,展示如何使用Rust和Actix-web框架搭建基本Web服务器,从创建项目到运行服务器全程指导,帮助读者领略Rust在Web后端开发中的强大能力。通过实践,读者可以体验到Rust在性能和安全性方面的优势,以及其在Web开发领域的无限潜力。
278 0
|
3天前
|
机器学习/深度学习 人工智能 程序员
阿里云出手DeepSeek拒绝服务器繁忙,程序员直呼:真香!
阿里云PAI平台支持一键部署DeepSeek-V3和DeepSeek-R1大模型,用户无需编写代码即可完成从训练到部署的全过程。通过PAI Model Gallery,开发者可轻松选择并部署所需模型版本,享受高效、便捷的AI开发体验。教程详细介绍了开通PAI、选择模型及一键部署的具体步骤,帮助用户快速上手。
|
4天前
|
机器学习/深度学习 存储 弹性计算
阿里云gpu云服务器租用价格:最新收费标准及活动价格参考
阿里云gpu云服务器多少钱?A10卡GN7i GPU云服务器32核188G3213.99/1个月起,V100卡GN6v GPU云服务器8核32G3830.00/1个月起,阿里云GPU云服务器是基于GPU应用的计算服务,多适用于视频解码,图形渲染,深度学习,科学计算等应用场景,该产品具有超强计算能力、网络性能出色、购买方式灵活、高性能实例存储( GA1和GN5特有)等特点。下面小编来介绍下阿里云gpu云服务器最新的收费标准及活动价格。
|
4天前
|
存储 机器学习/深度学习 人工智能
2025年阿里云GPU服务器租用价格、选型策略与应用场景详解
随着AI与高性能计算需求的增长,阿里云提供了多种GPU实例,如NVIDIA V100、A10、T4等,适配不同场景。2025年重点实例中,V100实例GN6v单月3830元起,适合大规模训练;A10实例GN7i单月3213.99元起,适用于混合负载。计费模式有按量付费和包年包月,后者成本更低。针对AI训练、图形渲染及轻量级推理等场景,推荐不同配置以优化成本和性能。阿里云还提供抢占式实例、ESSD云盘等资源优化策略,支持eRDMA网络加速和倚天ARM架构,助力企业在2025年实现智能计算的效率与成本最优平衡。 (该简介为原文内容的高度概括,符合要求的字符限制。)

热门文章

最新文章

  • 1
    打造高效的Web Scraper:Python与Selenium的完美结合
    13
  • 2
    Burp Suite Professional 2025.2 (macOS, Linux, Windows) - Web 应用安全、测试和扫描
    26
  • 3
    AppSpider Pro 7.5.015 for Windows - Web 应用程序安全测试
    20
  • 4
    【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
    54
  • 5
    部署使用 CHAT-NEXT-WEB 基于 Deepseek
    342
  • 6
    【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
    26
  • 7
    java spring 项目若依框架启动失败,启动不了服务提示端口8080占用escription: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port-优雅草卓伊凡解决方案
    40
  • 8
    零基础构建开源项目OpenIM桌面应用和pc web- Electron篇
    28
  • 9
    【01】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-硬件设备实时监控系统运营版发布-本产品基于企业级开源项目Zabbix深度二开-分步骤实现预计10篇合集-自营版
    22
  • 10
    FastAPI与Selenium:打造高效的Web数据抓取服务 —— 采集Pixabay中的图片及相关信息
    55