今天翻看自己以前的博客时,发现了这则博客,距今大约也有一年多的时间了,觉得还是蛮有趣的一个作业,于是跟着博客又做了一遍,觉得之前的排版有点不大好,所以此番用markdown 稍微重做些修改更新一下博客。

顾名思义,本博客是介绍如何用python编写一个多线程web服务器,于是我利用socket模块写了个TCP服务器,程序很简单,运行程序后,通过浏览器端输入:

localhost:port/xxxxxx

可以访问到本地文件目录中的文件,我在本地编写了两个html文件用于访问测试:

  • Success.html

    <!DOCTYPE html>
    <html>
    <head><title></title>
    <meta http-equiv="content-type" content="text/html"; charset="utf-8"/>
    </head>
    <body>
    </br>
    <center><h2>Connect to local web server!</h2></center>
    <center><img src="http://i2.sinaimg.cn/ent/m/c/2008-03-16/U2507P28T3D1949676F326DT20080316182933.jpg" width="300px"/></center>
    </br>
    <center><h4><a href="https://blog.csdn.net/wobeatit/article/details/88077445">MyCSDN</a></h4></center>
    </body>
    </html>
    
  • Fail.html

    <!DOCTYPE html>
    <html>
    <head><title></title>
    <meta http-equiv="content-type" content="text/html"; charset="utf-8"/>
    </head>
    <body>
    <center><h2>所访问的路径不存在!</h2></center>
    </br>
    <!--打开网页图片-->
    <center><img src="https://image.freepik.com/free-vector/404-error-web-template-with-cow-flying-flat-style_23-2147777436.jpg" width="400px"/></center>
    </br></br>
    <center><h4><a href="https://blog.csdn.net/wobeatit/article/details/88077445">LQ的博客</a></h4><center>
    </body>
    </html>
    
  • 附上Python源代码:

#*************************************#
#*** python 多线程web服务器的设计    ****#
#*** Author LQ                    ****#
#*** Python 版本:3.6.2             ****#
#*************************************##-*- coding: utf-8 -*-
from socket import *
import threading # 引入线程模块
import os# 针对线程使用编写的函数
def Server(tcpClisock, addr):BUFSIZE = 1024 # 将缓冲区大小设置为 1KB。listen()方法的参数是在连接被转接或拒绝之前,传入连接请求的最大数print('connected from:', addr) rec = tcpClisock.recv(BUFSIZE)data = rec.decode()# 当服务器因为网络问题未收到返回信息时,直接退出if len(data) == 0:tcpClisock.close()return HOME_DIR = os.getcwd() # 服务器端可访问的文件目录print("***************************************************\n")index = 4 # 检索文件的搜索路径# 找到路径while data[index] != ' ':index += 1# 如果检索文件为空,则默认导向访问成功的页面if index == 5 : direction = os.path.join(HOME_DIR, "Success.html") else: direction = os.path.join(HOME_DIR, data[5 : index]) # 拼接出完整的路径# 如果路径存在,本服务器默认只支持访问html文件if os.path.exists(direction) and direction.endswith(".html"):file=open(direction) # 打开路径中的文件SUCCESS_PAGE = "HTTP/1.1 200 OK\r\n\r\n" + file.read() # 构造成功报文反馈给服务器print(SUCCESS_PAGE)tcpClisock.sendall(SUCCESS_PAGE.encode()) # 返回给客户端浏览器成功的页面# sendall 函数只可发送字节类型,对字符串数据进行转换tcpClisock.close() # 关闭专门针对一个客户机程序创建的新套接字# 如果路径不存在,返回失败页面else:FAIL_PAGE = "HTTP/1.1 404 NotFound\r\n\r\n" + open(os.path.join(HOME_DIR, "Fail.html")).read()print(FAIL_PAGE)tcpClisock.sendall(FAIL_PAGE.encode()) # 返回给客户端浏览器失败的页面# sendall 函数只可发送字节类型,对字符串数据进行转换tcpClisock.close() # 关闭专门针对一个客户机程序创建的新套接字if __name__ =='__main__': HOST = "" # HOST 变量是空白的,这是对 bind()方法的标识,表示它可以使用任何可用的地址  # 此程序在什么主机上运行,就会为该主机的IP地址PORT = 4004  # 随机的端口号,并且该端口号似乎没有被使用或被系统保留ADDR = (HOST, PORT) # 地址 = 主机名 + 端口号tcpSersock = socket(AF_INET, SOCK_STREAM) # 创建一个套接字对象tcpSersock.bind(ADDR) # 将套接字绑定到服务器地址  相当于欢迎套接字,且绑定的是源ip地址以及源端口号。始终欢迎别的套接字的申请接入tcpSersock.listen(5) # 启用服务器的监听,调用参数是在连接被转接或拒绝之前,传入连接请求的最大数,此处说明允许传入链接请求数为5print("waiting for connection......\n")                  while True:  #进入无限循环tcpClisock, addr = tcpSersock.accept() # 调用 accept()函数之后,就开启了一个简单的(单线程)服务器,它会等待客户端的连接。# 默认情况下,accept()是阻塞的,这意味着执行将被暂停,直到一个连接到达。# 当一个传入的请求到达时,服务器会创建一个新的通信端口来直接与客户端进行通信,再次空出主要的端口# 使用新的客户端套接字能够空出主线(原始服务器套接字)以使其能够接受新的客户端连接。 thread = threading.Thread(target=Server, args=(tcpClisock, addr))  thread.start() # 开始执行该线程tcpSersock.close() # 这种情况永远也不会碰到,因为在此程序中,服务器始终在一个无限循环中运行# 但如果写了一个处理程序,当一个处理程序检测到一些外部条件时,服务器就应该关闭。应该调用一个 close()方法关闭服务器的欢迎套接字

具体实现的功能有:

  • 向服务器请求特定文件,从服务器文件系统读取请求的文件,并创建一个由请求的文件的html内容组成的HTTP响应报文反馈给浏览器并显示出来
    HTTP/1.1 200 OK<!DOCTYPE html>
    <html>
    <head><title></title>
    <meta http-equiv="content-type" content="text/html"; charset="utf-8"/>
    </head>
    <body>
    </br>
    <center><h2>Connect to local web server!</h2></center>
    <center><img src="http://i2.sinaimg.cn/ent/m/c/2008-03-16/U2507P28T3D1949676F326DT20080316182933.jpg" width="300px"/></center>
    </br>
    <center><h4><a href="https://blog.csdn.net/wobeatit/article/details/88077445">MyCSDN</a></h4></center>
    </body>
    </html>
    

    从后台可以看到请求的文件的内容

从浏览器端显示出的访问服务器文件成功的页面

  • 多线程
connected from: ('127.0.0.1', 59634)
***************************************************HTTP/1.1 200 OK<!DOCTYPE html>
<html>
<head><title></title>
<meta http-equiv="content-type" content="text/html"; charset="utf-8"/>
</head>
<body>
</br>
<center><h2>Connect to local web server!</h2></center>
<center><img src="http://i2.sinaimg.cn/ent/m/c/2008-03-16/U2507P28T3D1949676F326DT20080316182933.jpg" width="300px"/></center>
</br>
<center><h4><a href="https://blog.csdn.net/wobeatit/article/details/88077445">MyCSDN</a></h4></center>
</body>
</html>connected from: ('127.0.0.1', 59670)
***************************************************HTTP/1.1 200 OK<!DOCTYPE html>
<html>
<head><title></title>
<meta http-equiv="content-type" content="text/html"; charset="utf-8"/>
</head>
<body>
</br>
<center><h2>Connect to local web server!</h2></center>
<center><img src="http://i2.sinaimg.cn/ent/m/c/2008-03-16/U2507P28T3D1949676F326DT20080316182933.jpg" width="300px"/></center>
</br>
<center><h4><a href="https://blog.csdn.net/wobeatit/article/details/88077445">MyCSDN</a></h4></center>
</body>
</html>

多个客户端访问服务器时,都可以并发地访问,通过后台观察打印出的地址可以发现服务器已经接收到了多个客户端的访问,并且服务器为每个客户端联系时均建立了连接套接字 从浏览器访问可以看出,可以同时打开两个页面访问本地服务器,其中服务器的端口号为4004

  • 异常检测

访问服务器中不存在的文件路径时,后台会返回访问失败的页面:

connected from: ('127.0.0.1', 35590)
***************************************************HTTP/1.1 404 NotFound<!DOCTYPE html>
<html>
<head><title></title>
<meta http-equiv="content-type" content="text/html"; charset="utf-8"/>
</head>
<body>
<center><h2>所访问的路径不存在!</h2></center>
</br>
<!--打开网页图片-->
<center><img src="https://image.freepik.com/free-vector/404-error-web-template-with-cow-flying-flat-style_23-2147777436.jpg" width="400px"/></center>
</br></br>
<center><h4><a href="http://blog.csdn.net/wobeatit/article/details/78641032">LQ的博客</a></h4><center>
</body>
</html>

此时浏览器端会返回访问失败的页面:

利用python编写设计多线程web服务器(计算机网络_自顶向下第六版_第二章1和4的编程作业)相关推荐

  1. 计算机网路实验二 多线程Web服务器的设计与实现

    计算机网路实验二 多线程Web服务器的设计与实现 一. 实验目的及任务 1.实验目的 熟悉简单网络的搭建与基本配置: 熟悉socket.多线程编程: 熟悉JDK编程工具的基本使用: 熟悉HTTP协议: ...

  2. python爬虫简单实例-Python 利用Python编写简单网络爬虫实例3

    利用Python编写简单网络爬虫实例3 by:授客 QQ:1033553122 实验环境 python版本:3.3.5(2.7下报错 实验目的 获取目标网站"http://bbs.51tes ...

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

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

  4. 利用Python编写一个高斯正反算程序

    一.前言 这次的高斯正反算程序是使用的Python编写的. 环境信息是:Win10.PyCharm 2021.3.1.PySide6 6.3.1.Python 3.9.9,基于QT Designer设 ...

  5. java使用socket实现一个多线程web服务器

    全栈工程师开发手册 (作者:栾鹏) java教程全解 java使用socket实现一个多线程web服务器 除了服务器类,还包括请求类和响应类 请求类:获取客户的HTTP请求,分析客户所需要的文件 响应 ...

  6. 利用android实现汇率计算器,利用python编写一个汇率计算器

    利用python编写一个汇率计算器 发布时间:2020-11-10 15:03:44 来源:亿速云 阅读:137 作者:Leah 这篇文章运用简单易懂的例子给大家介绍利用python编写一个汇率计算器 ...

  7. 利用python编写手机脚本

    利用python编写手机脚本 adb连接安卓模拟器 在手机里编写python脚本控制手机 如何使用python控制手机(以微信游戏跳一跳为例) adb连接安卓模拟器 链接(转载)https://www ...

  8. 利用python来自己写一个服务器台账统计小工具

    利用python来自己写一个服务器台账统计小工具 前言 无奈呀,压力创造成品 背景是这样的,相信在看的各位在管理服务器密码的时候,肯定会有个台账啥的,当然咱也有,但是吧,为了安全期间,不允许出现在服务 ...

  9. 利用Python编写代码实现消息自动回复

    前言   利用python编写一小段代码可代码实现QQ.微信好友自动发消息的功能,从而达到"消息轰炸"的效果.代码很简单也很有趣,快来一起看看吧 目录 准备条件   焦点获取  代 ...

最新文章

  1. 深度学习入门指北——从硬件到软件
  2. java远程线程注入_系统权限远程线程注入到Explorer.exe
  3. 谷歌-百度世界杯大数据预测,哪家更准?
  4. java 百分比相加_2019年Java面试题基础系列228道(5),快看看哪些你还不会?
  5. 用最少的机器支撑万亿级访问,微博6年Redis优化历程
  6. 阿里员工都是这样排查Java问题的,附工具单
  7. 6.3、分区表、分区表索引--Oracle模式对象
  8. HDU - 6599 I Love Palindrome String (回文树+Manacher、回文树+hash)
  9. 已经是最大股东却还要全资收购!腾讯看上了搜狗的啥?
  10. Java解析Json
  11. pandas series 判断是否包含某个值
  12. 51nod-1065:最小正子段和
  13. SVN使用过程中出现“工作副本已经锁定”的解决办法
  14. java连接数据库驱动代码综合共享
  15. 三菱MDS-D-SVJ3-10/20/10NA/20NA伺服驱动器
  16. HP OMEN品牌机配3090显卡,驱动,CUDA,Cudnn安装过程
  17. Codeforces Round #766 (Div. 2)C. Not Assigning
  18. 智能车扫线——斑马线识别
  19. 组件化、模块化、Composing Builds
  20. Python制作的足球双人小游戏,你确定你不过来看看?

热门文章

  1. 数据结构实验之图论八:欧拉回路
  2. 1、用Anaconda配置Windows环境下的tensorflow(CPU版本)
  3. 【深度学习】CUDA 和 TensorRT 博客搜集
  4. Programming Computer Vision with Python (学习笔记三)
  5. Git远程库版本回滚
  6. Latex论文排版技巧再总结
  7. KMeans聚类算法Hadoop实现
  8. ROS探索总结(十三)(十四)(十五)——导航与定位框架 move_base(路径规划) amcl(导航与定位)
  9. 简明python教程 --C++程序员的视角(二):函数及作用域
  10. 递归算法学习系列之八皇后问题