需求:用python实现一个简单的http服务器

网页源码文件:https://download.csdn.net/download/d1240673769/46963534

该文件为html文件,如下图:

用python搭建一个静态的http服务器,通过web访问 python 目录下的文件内容,如下图

系统环境:centos7、python3

将网页源码文件包下载后,上传到centos中 /web/路径下,如下图:

实现代码:

# -*- coding: utf-8 -*-import socket
import re
import urllib.parsedef service_client(new_socket):# 为这个客户端返回数据# 1.接收浏览器发过来的请求,即http请求# GET / HTTP/1.1request = new_socket.recv(1024).decode('utf-8')request_header_lines = request.splitlines()ret = re.match(r'[^/]+(/[^ ]*)',request_header_lines[0])path_name = "/"if ret:path = ret.group(1) # 取出请求中的路径名path_name = urllib.parse.unquote(path) # 浏览器请求的路径中带有中文,会被自动编码,需要先解码成中文,才能找到后台中对应的html文件print("请求路径:{}".format(path_name))if path_name == "/":  # 用户请求/时,返回index.html页面path_name = "/index.html"# 2.返回http格式的数据给浏览器file_name = '/web/python' + path_nametry:f = open(file_name,'rb')except:response = "HTTP/1.1 404 NOT FOUND\r\n"response += "\r\n"response += "------file not found------"new_socket.send(response.encode("utf-8"))else:html_content = f.read()f.close()# 准备发给浏览器的数据 -- headerresponse = "HTTP/1.1 200 OK\r\n"response += "\r\n"new_socket.send(response.encode("utf-8"))new_socket.send(html_content)    # 关闭套接字new_socket.close()def main():# 用来完成整体的控制# 1.创建套接字tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 设置当服务器先close 即服务器端4次挥手之后资源能够立即释放,这样就保证了,下次运行程序时 可以立即绑定7788端口tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)# 2.绑定tcp_server_socket.bind(("",8100))    # 3.变为监听套接字tcp_server_socket.listen(128)while True:# 4.等待新客户端的链接new_socket, client_addr = tcp_server_socket.accept()       # 5.为这个客户端服务service_client(new_socket)# 关闭监听套接字tcp_server_socket.close()if __name__ == '__main__':main()

运行程序后,通过浏览器访问:http://192.168.149.150:8100

使用多进程实现

# -*- coding: utf-8 -*-import socket
import re
import urllib.parse
import multiprocessingdef service_client(new_socket):# 为这个客户端返回数据# 1.接收浏览器发过来的请求,即http请求# GET / HTTP/1.1request = new_socket.recv(1024).decode('utf-8')request_header_lines = request.splitlines()ret = re.match(r'[^/]+(/[^ ]*)',request_header_lines[0])path_name = "/"if ret:path = ret.group(1) # 取出请求中的路径名path_name = urllib.parse.unquote(path) # 浏览器请求的路径中带有中文,会被自动编码,需要先解码成中文,才能找到后台中对应的html文件print("请求路径:{}".format(path_name))if path_name == "/":  # 用户请求/时,返回index.html页面path_name = "/index.html"# 2.返回http格式的数据给浏览器file_name = '/web/python' + path_nametry:f = open(file_name,'rb')except:response = "HTTP/1.1 404 NOT FOUND\r\n"response += "\r\n"response += "------file not found------"new_socket.send(response.encode("utf-8"))else:html_content = f.read()f.close()# 准备发给浏览器的数据 -- headerresponse = "HTTP/1.1 200 OK\r\n"response += "\r\n"new_socket.send(response.encode("utf-8"))new_socket.send(html_content)# 关闭套接字new_socket.close()def main():# 用来完成整体的控制# 1.创建套接字tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 设置当服务器先close 即服务器端4次挥手之后资源能够立即释放,这样就保证了,下次运行程序时 可以立即绑定7788端口tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)# 2.绑定tcp_server_socket.bind(("",8200))# 3.变为监听套接字tcp_server_socket.listen(128)while True:# 4.等待新客户端的链接new_socket, client_addr = tcp_server_socket.accept()# 5.为这个客户端服务p = multiprocessing.Process(target=service_client, args=(new_socket,))p.start()new_socket.close()# 关闭监听套接字tcp_server_socket.close()if __name__ == '__main__':main()

使用多线程实现

# -*- coding: utf-8 -*-import socket
import re
import urllib.parse
import threadingdef service_client(new_socket):# 为这个客户端返回数据# 1.接收浏览器发过来的请求,即http请求# GET / HTTP/1.1request = new_socket.recv(1024).decode('utf-8')request_header_lines = request.splitlines()ret = re.match(r'[^/]+(/[^ ]*)',request_header_lines[0])path_name = "/"if ret:path = ret.group(1) # 取出请求中的路径名path_name = urllib.parse.unquote(path) # 浏览器请求的路径中带有中文,会被自动编码,需要先解码成中文,才能找到后台中对应的html文件print("请求路径:{}".format(path_name))if path_name == "/":  # 用户请求/时,返回index.html页面path_name = "/index.html"# 2.返回http格式的数据给浏览器file_name = '/web/python' + path_nametry:f = open(file_name,'rb')except:response = "HTTP/1.1 404 NOT FOUND\r\n"response += "\r\n"response += "------file not found------"new_socket.send(response.encode("utf-8"))else:html_content = f.read()f.close()# 准备发给浏览器的数据 -- headerresponse = "HTTP/1.1 200 OK\r\n"response += "\r\n"new_socket.send(response.encode("utf-8"))new_socket.send(html_content)# 关闭套接字new_socket.close()def main():# 用来完成整体的控制# 1.创建套接字tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 设置当服务器先close 即服务器端4次挥手之后资源能够立即释放,这样就保证了,下次运行程序时 可以立即绑定7788端口tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)# 2.绑定tcp_server_socket.bind(("",8200))# 3.变为监听套接字tcp_server_socket.listen(128)while True:# 4.等待新客户端的链接new_socket, client_addr = tcp_server_socket.accept()# 5.为这个客户端服务t = threading.Thread(target=service_client, args=(new_socket,))t.start()# 关闭监听套接字tcp_server_socket.close()if __name__ == '__main__':main()

使用gevent实现

# -*- coding: utf-8 -*-import socket
import re
import urllib.parse
import gevent
from gevent import monkeymonkey.patch_all()def service_client(new_socket):# 为这个客户端返回数据# 1.接收浏览器发过来的请求,即http请求# GET / HTTP/1.1request = new_socket.recv(1024).decode('utf-8')request_header_lines = request.splitlines()ret = re.match(r'[^/]+(/[^ ]*)',request_header_lines[0])path_name = "/"if ret:path = ret.group(1) # 取出请求中的路径名path_name = urllib.parse.unquote(path) # 浏览器请求的路径中带有中文,会被自动编码,需要先解码成中文,才能找到后台中对应的html文件print("请求路径:{}".format(path_name))if path_name == "/":  # 用户请求/时,返回index.html页面path_name = "/index.html"# 2.返回http格式的数据给浏览器file_name = '/web/python' + path_nametry:f = open(file_name,'rb')except:response = "HTTP/1.1 404 NOT FOUND\r\n"response += "\r\n"response += "------file not found------"new_socket.send(response.encode("utf-8"))else:html_content = f.read()f.close()# 准备发给浏览器的数据 -- headerresponse = "HTTP/1.1 200 OK\r\n"response += "\r\n"new_socket.send(response.encode("utf-8"))new_socket.send(html_content)# 关闭套接字new_socket.close()def main():# 用来完成整体的控制# 1.创建套接字tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 设置当服务器先close 即服务器端4次挥手之后资源能够立即释放,这样就保证了,下次运行程序时 可以立即绑定7788端口tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)# 2.绑定tcp_server_socket.bind(("",8100))# 3.变为监听套接字tcp_server_socket.listen(128)while True:# 4.等待新客户端的链接new_socket, client_addr = tcp_server_socket.accept()# 5.为这个客户端服务gevent.spawn(service_client, new_socket)# 关闭监听套接字tcp_server_socket.close()if __name__ == '__main__':main()

单进程、单线程、长链接实现多任务

# -*- coding: utf-8 -*-import socket
import re
import urllib.parsedef service_client(new_socket, request):# 为这个客户端返回数据# 1.接收浏览器发过来的请求,即http请求# GET / HTTP/1.1request_header_lines = request.splitlines()ret = re.match(r'[^/]+(/[^ ]*)',request_header_lines[0])path_name = "/"if ret:path = ret.group(1) # 取出请求中的路径名path_name = urllib.parse.unquote(path) # 浏览器请求的路径中带有中文,会被自动编码,需要先解码成中文,才能找到后台中对应的html文件print("请求路径:{}".format(path_name))if path_name == "/":  # 用户请求/时,返回index.html页面path_name = "/index.html"# 2.返回http格式的数据给浏览器file_name = '/web/python' + path_nametry:f = open(file_name,'rb')except:response = "HTTP/1.1 404 NOT FOUND\r\n"response += "\r\n"response += "------file not found------"new_socket.send(response.encode("utf-8"))else:response_body = f.read()f.close()# 准备发给浏览器的数据 -- headerresponse_header = "HTTP/1.1 200 OK\r\n"response_header += "Content-Length:{}\r\n".format(len(response_body)) # 这个字段表示一条数据的长度response_header += "\r\n"new_socket.send(response_header.encode("utf-8"))new_socket.send(response_body)def main():# 用来完成整体的控制# 1.创建套接字tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 设置当服务器先close 即服务器端4次挥手之后资源能够立即释放,这样就保证了,下次运行程序时 可以立即绑定7788端口tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)# 2.绑定tcp_server_socket.bind(("",8100))# 3.变为监听套接字tcp_server_socket.listen(128)tcp_server_socket.setblocking(False) # 设置套接字为非堵塞的方式client_socket_list = list() # 创建一个列表,目的是将已将连接的客户端加入到列表中while True:# 4.等待新客户端的链接try:new_socket, client_addr = tcp_server_socket.accept()except Exception as ret:passelse:new_socket.setblocking(False)client_socket_list.append(new_socket)for client_socket in client_socket_list:try:recv_data = client_socket.recv(1024).decode("utf-8")except Exception as ret:passelse:if recv_data:service_client(client_socket,recv_data)else:client_socket.close()client_socket_list.remove(client_socket)# 关闭监听套接字tcp_server_socket.close()if __name__ == '__main__':main()

python实现一个简单的http服务器相关推荐

  1. 用python写一个简单的web服务器

    人生苦短,我用python 简洁高效,这才是理想的语言啊 分享一点python的学习经验-----如何用python写一个简单的web服务器 首先,我们需要简单地了解一下网络通信协议,这里用白话介绍一 ...

  2. 通过python 构建一个简单的聊天服务器

    构建一个 Python 聊天服务器 一个简单的聊天服务器 现在您已经了解了 Python 中基本的网络 API:接下来可以在一个简单的应用程序中应用这些知识了.在本节中,将构建一个简单的聊天服务器.使 ...

  3. 用python做一个简单的http服务器。把huya的直播地址用python解出。解后在浏览器中调用openffplayer。

    接前面的工作 .这里主要在做一个简单的简单的http服务器.其实这个http是网上抄别人的. 主要文件有三个. 1,server.py 很简单的处理socket,还有处理httphead的线程.是一个 ...

  4. Python实现一个简单的socket服务器

    该服务器主要实现从客户端拷贝文件(.c)到指定目录,再把这个文件发送给服务器,并让服务器执行脚本,执行脚本需要用到这个.c文件进行编译,编译完告诉客户端,并且把编译生成的多个文件夹(含文件)发送给客户 ...

  5. python websocket server_用Python实现一个简单的WebSocket服务器

    2. 数据长度在 128-65525 之间时 , Payload Length 位设为 126 , 后面 额外使用 16bit 表 示长度 ( 前面的 126 不再是长度的一部分 ) 3. 数据长度在 ...

  6. web服务器python_一个简单的web服务器(python)

    今天用python写一个简单的web服务器代码网上都有只是为了方便大家学习做了一个简单的教程 第一首先我们来一张架构以及运行过程的流程图 本文学习仅供参考,需要更多资料可以加群:496257369 简 ...

  7. 用Python建立最简单的web服务器

    用Python建立最简单的web服务器 利用Python自带的包可以建立简单的web服务器.在DOS里cd到准备做服务器根目录的路径下,输入命令: python -m Web服务器模块 [端口号,默认 ...

  8. python编写登录_通过Python编写一个简单登录功能过程解析

    通过Python编写一个简单登录功能过程解析 需求: 写一个登录的程序, 1.最多登陆失败3次 2.登录成功,提示欢迎xx登录,今天的日期是xxx,程序结束 3.要检验输入是否为空,账号和密码不能为空 ...

  9. python爬虫抢火车票_如何用python写一个简单的12306抢票软件|python 爬火车票 教程...

    python 如果抓取验证码图片 类似12306的登录验证码图片 这个以前做次.最大的麻烦是码的识别算法的识别率太低.12306那种网站登陆错3次就限制你20分钟.所以除非你有33%以上的识别率否则不 ...

最新文章

  1. Python中将pandas的dataframe拷贝到剪切板并保持格式实战:to_clipboard()函数、复制到Excel文件、复制到文本文件(默认是tsv格式)、复制到文本文件(设置逗号分隔符)
  2. Synergy 共享键盘和鼠标
  3. Eclipse中异常断点问题
  4. css3 奇技淫巧 - 如何给小汽车换个背景色谈起
  5. 基于MATLAB的MIMO系统分层空时码的仿真
  6. 云服务器安装虚拟机方法,云服务器安装虚拟机方法
  7. html text align属性,HTML canvas
  8. display: inline-block;为什么会撑开父div
  9. 传奇病毒劫持流量手法分析
  10. 洛必达法则及极限问题总结
  11. 支持iphone的打印服务器,无需购买WiFi打印机,实现电脑、iPad、iPhone共享无线打印...
  12. TF卡里删掉文件后内存没变大_电视装好kodi后打不开?播放原盘4K很卡?教你怎么解决...
  13. 第一周学习报告(关于string)
  14. 首先实现储存程序的电子数字计算机是什么,世界上首先实现存储程序的电子计算机是什么...
  15. 解决IE下input事件初始化自动执行的问题
  16. 中国石油大学《机械原理》第二次在线作业
  17. 重磅丨FIL10月减产即将到来 2分钟了解FIL分配模型
  18. You can find the Nike LeBron Soldier 11 now at kd10sale.com
  19. Python 100道基础入门练习题(附答案)【这期完结】
  20. 骁龙8+gen1和天玑9000+区别 骁龙8+和天玑9000+评测选哪个好

热门文章

  1. jquery $ # 什么意思
  2. python爬虫自动提交HDU并获取AC状态(p3+request+Beatifulsoup)
  3. php 网站在线客服,网页在线客服PHP源码含APP
  4. 什么是IOC/DI?
  5. win8电脑打不开html文件,Win8网页打不开qq能上_Win8能上qq打不开网页怎么办?-192路由网...
  6. 游戏中的显示器选项的acm
  7. cadence allegro 17.2中的正负片
  8. AttributeError: builtin_function_or_method object has no attribute mktime
  9. JavaScript设计模式——订阅者-发布者模式简单实现
  10. 快速校验非法字符工具