用python写的简单的http文件服务器demo
生活随笔
收集整理的這篇文章主要介紹了
用python写的简单的http文件服务器demo
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 四大名捕会京师剧情介绍
- 下一篇: 不孕不育症要怎么治疗