import socket
import os
import re
import time
from multiprocessing import Processclass CHttpServer(object):"""Httpserver服务端类"""def __init__(self):self.m_serverSocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)self.m_serverSocket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)self.m_buf_size = 8 * 1024 * 1024def start(self):self.m_serverSocket.listen(128)while(True):m_clientSocket,m_clientAddr = self.m_serverSocket.accept()m_clientSocket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)print("创建的socket是", end="")print(m_clientSocket)print('[%s,%s]用户连接上了服务器' % m_clientAddr)handle_client_process = Process(target = self.handle_client,args=(m_clientSocket,))handle_client_process.start()m_clientSocket.close()#数据处理进程def handle_client(self,clientSocket):'''处理客户请求操作'''#获取客户请求数据print("进程:", end="")print(os.getpid())request_data = clientSocket.recv(2048)print('接收到的数据:%s' % request_data)request_lines=request_data.splitlines()bytes_start = ""bytes_end = ""req_method = str(request_lines[0], encoding="utf8").split("/")[0].strip()print(req_method)print(req_method)req_data_byte_status = Falseif req_method == "GET":for line in request_lines:print(str(line))if "Range" in str(line, encoding="utf8") or "range" in str(line, encoding="utf8") :bytes_start, bytes_end = self.parse_range(str(line, encoding="utf8"))req_data_byte_status = Truefile_size = os.path.getsize("test.mp4")if req_data_byte_status:if bytes_end == "" and bytes_start == "0" : # 说明全部读取response_start_line = "HTTP/1.1 206 Partial Content\r\n"response_headers = "Server: My server\r\n"response_headers = response_headers + "Accept-Ranges: bytes\r\n"# response_headers = response_headers + "Content-Length: {}\r\n".format(str(file_size))response_headers = response_headers + "Content-Length: {}\r\n".format(str(file_size))response_headers = response_headers + "Content-Range: bytes 0-{}/{}\r\n".format(str(file_size-1), file_size)response_headers = response_headers + "Content-Type: video/mp4\r\n"response = response_start_line + response_headers + "\r\n"clientSocket.send(bytes(response, "utf8"))  # 到底是不是这种模式videofile = open("test.mp4", "rb")while True:video_bytes = videofile.read(self.m_buf_size)if not video_bytes: #文件读取完毕breakprint("socket status :", end="")print(clientSocket)try:clientSocket.send(video_bytes)except Exception as e:print(e)breakvideofile.close()clientSocket.close()  # 这里如果不 close, 这个子进程结束运行后else:bytes_start = int(bytes_start)if bytes_start >= file_size:response_body =  "<html><head><title>416 Requested Range Not Satisfiable</title></head><body><center><h1>416 Requested Range Not Satisfiable</h1></center><hr><center>nginx/1.18.0</center></body></html>"response_start_line = "HTTP/1.1 416 Requested Range Not Satisfiable\r\n"response_headers = "Server: My server\r\n"response_headers = response_headers + "Accept-Ranges: bytes\r\n"response_headers = response_headers + "Content-Length: {}\r\n".format(len(response_body))response_headers = response_headers + "Content-Type: text/html\r\n"response_headers = response_headers + "Content-Range: bytes */{}\r\n".format(str(file_size))response = response_start_line + response_headers + "\r\n"response = response + response_bodyclientSocket.send(bytes(response, "utf8"))clientSocket.close()else:if bytes_end != "" :bytes_end = int(bytes_end)else:bytes_end = file_size - 1need_get_size = bytes_end - bytes_start + 1total_get_size = 0response_start_line = "HTTP/1.1 206 Partial Content\r\n"response_headers = "Server: My server\r\n"response_headers = response_headers + "Accept-Ranges: bytes\r\n"response_headers = response_headers + "Content-Length: {}\r\n".format(str(bytes_end - bytes_start + 1))response_headers = response_headers + "Content-Type: video/mp4\r\n"response_headers = response_headers + "Content-Range: bytes {}-{}/{}\r\n".format(str(bytes_start), str(bytes_end), file_size)response = response_start_line + response_headers + "\r\n"print(response)clientSocket.send(bytes(response, "utf8"))videofile = open("test.mp4", "rb")videofile.seek(bytes_start, 0)while True:if self.m_buf_size < need_get_size:video_bytes = videofile.read(self.m_buf_size)if not video_bytes: # 说明文件读取完毕breakprint("-"*25)print(need_get_size)try:clientSocket.send(video_bytes)except Exception as e:print(e)breakneed_get_size = need_get_size - len(video_bytes)else:video_bytes = videofile.read(need_get_size)if not video_bytes:  # 说明文件读取完毕breaktry:clientSocket.send(video_bytes)except Exception as e:print(e)breakbreakvideofile.close()clientSocket.close() # 这里如果不 close, 这个子进程结束运行后, socket会不会自己close掉else:# response_start_line = "HTTP/1.1 206 Partial Content\r\n" QT 播放器 在这里会失败response_start_line = "HTTP/1.1 200 ok\r\n"response_headers = "Server: My server\r\n"response_headers = response_headers + "Accept-Ranges: bytes\r\n"response_headers = response_headers + "Content-Length: {}\r\n".format(str(file_size))response_headers = response_headers + "Content-Range: bytes 0-{}/{}\r\n".format(str(file_size - 1),file_size)response_headers = response_headers + "Content-Type: video/mp4\r\n"response = response_start_line + response_headers + "\r\n"clientSocket.send(bytes(response, "utf8"))  # 到底是不是这种模式print(response)videofile = open("test.mp4", "rb")while True:video_bytes = videofile.read(self.m_buf_size)if not video_bytes:  # 文件读取完毕breakprint("socket status :", end="")print(clientSocket)try:clientSocket.send(video_bytes)except Exception as e:print(e)breakvideofile.close()clientSocket.close()def parse_range(self, part_header):'''解析出请求中的 range start end:return: start end'''print(part_header)temp = part_header.split(":")temp = temp[1].split("=")temp = temp[1].split("-")start = temp[0]end = ""if len(temp) == 2:end = temp[1]return start, enddef get_file_info(self, url):pass#绑定端口def bind(self,port):self.m_serverSocket.bind(('',port))def parseline(self,strcon):"""解析字符串"""passdef main():http_server = CHttpServer()http_server.bind(8000)http_server.start()if __name__ == "__main__":main()# http://127.0.0.1:8000

用python写的简单的http文件服务器demo相关推荐

  1. python推荐系统-用python写个简单的推荐系统示例程序

    用python写个简单的推荐系统示例程序 作者:阿俊 发布于:2011-11-26 16:03 Saturday 分类:推荐系统 python这门语言写程序代码量非常少,短短几行就可以把程序写的很清楚 ...

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

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

  3. 利用python写一个简单的双色球彩票系统

    利用python写一个简单的双色球彩票系统 1.设置每次买的号码一样 写一个双色球彩票系统,系统可以随机产生一组数据,一组彩票数据有六位数,这六位数的的取值范围是0和1. 一张彩票是两块钱,用户可以选 ...

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

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

  5. 用Python写一个简单的双均线策略分析

    用Python写一个简单的双均线策略 双均线策略 先罗列一下我知道的量化策略: 双均线:一句话来讲就是金叉买死叉卖. 布林带:突破压力线(上轨)清仓,跌破支撑线(下轨)持仓. PEG:根据PE/G调整 ...

  6. python解析器是什么_如何用python写一个简单的词法分析器

    编译原理老师要求写一个java的词法分析器,想了想决定用python写一个. 目标 能识别出变量,数字,运算符,界符和关键字,用excel表打印出来. 有了目标,想想要怎么实现词法分析器. 1.先进行 ...

  7. python可以做机器人吗_零基础如何用Python写一个简单的WeChat机器人?(内附代码)...

    (bing图片) python这两年热火朝天,依托其众多类库,基于python的应用层出不穷,也大大降低了非计算机专业人员的入门门槛,WeChat机器人自然不在话下!-- 聪明的瓦肯人 苦于有时候总是 ...

  8. python写一个简单的12306抢票

    引言 每逢过年就到了12306抢票高峰期,自己总想研究一下12306购票的流程,虽然网上已经很多资料,但是总比不过自己的亲身体会,于是便琢磨着写一个抢票软件,本人比较熟悉python,所以软件是用py ...

  9. python写词法分析器_如何用python写一个简单的词法分析器

    编译原理老师要求写一个java的词法分析器,想了想决定用python写一个. 目标 能识别出变量,数字,运算符,界符和关键字,用excel表打印出来. 有了目标,想想要怎么实现词法分析器. 1.先进行 ...

最新文章

  1. SAP WM 执行VL06P为交货单创建组,报错-TO for multiple deliveries only with delayed delivery update-
  2. MATLAB中plot()画图的颜色线型和希腊字母参数设置
  3. 如何开发自己的第1个可以上线的Java项目?
  4. 32.ExtJS简单的动画效果
  5. 一行Java代码判断文件夹是否存在,不存在则新建
  6. c语言和其他高级语言一样也要经过编译,C语言和其他高级语言的最大的区别是什么?...
  7. 如何在html页面遍历对象,Python:如何使用LXML/Requests遍历HTML元素对象?
  8. Android获取状态栏、标题栏、屏幕高度
  9. 聊一聊CSS中的死循环
  10. net framework 3.5 安装错误_PageAdmin CMS建站系统报http403错误的解决方案
  11. android fragment学习4-底部布局扩展TabLayout
  12. 一行 Python 代码能干什么?有意思!
  13. 微软公有云魅力之Traffic Manager
  14. PHPThumb处理图片
  15. 无法为jsp编译类_《刺激战场》改名为《和平精英》,有2类玩家或可能无法登陆游戏...
  16. 【DirectX3D - 5】渲染多路视频(单一窗口)
  17. python读取odb_abaqus通过python从ODB中抽取模型数据和结果数据.pdf
  18. 数据结构(四):KD树
  19. 《tkinter实用教程二》tkinter的子模块ttk
  20. wsl arch linux图形,WSL2(Arch Linux)使用systemd

热门文章

  1. 动态规划--图像压缩
  2. 【JS】使用变量作为object的key-方法汇总
  3. BZOJ5093图的价值(斯特林数)
  4. 接口自动化测试持续集成--Soapui接口功能测试参数化
  5. 【从入门到放弃】23种设计模式(1):设计模式综述
  6. 【升级版】如何使用阿里云云解析API实现动态域名解析,搭建私有服务器【含可执行文件和源码】...
  7. H5网页适配 iPhoneX,就是这么简单
  8. QTP自传之web常用对象
  9. 不具有继承关系的Delegate如何进行类型转换?
  10. 修改窗口图标 AfxRegisterWndClass()