python 简易web静态服务器-1

python 简易web静态服务器-1

显示固定的界面

import socket

def handle_client(client_socket):
	recv_data=client_socket.recv(1024).decode("utf-8")
	request_header_lines=recv_data.splitlines()
	for line in request_header_lines:
		print(line)

	response_headers="HTTP/1.1 200 OK\r\n"
	response_headers+="Server:PythonWebServer1.0\r\n"
	response_headers+="Content-Type: text/html;charset=utf-8\r\n"
	response_headers+="\r\n"
	response_body="hello world"
	response=response_headers+response_body

	client_socket.send(response.encode("utf-8"))
	client_socket.close()


def main():
	TCP_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
	#设置当前服务器先close 即服务器端4次握手后资源能立即释放,这样就保证了,下次运行程序时可以立即绑定端口
	TCP_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
	TCP_socket.bind(("",7788))
	TCP_socket.listen(128)
	while True:
		client_socket =TCP_socket.accept()
		client_addr=client_socket[1]
		client_socket=client_socket[0]
		handle_client(client_socket)

main()

运行结果
在这里插入图片描述在这里插入图片描述

显示需要的页

import socket
import re

DOCUMENTS_ROOT="./html"
def handle_client(client_socket):
	recv_data=client_socket.recv(1024).decode("utf-8",errors="ignore")
	request_header_lines=recv_data.splitlines()
	for line in request_header_lines:
		print(line)
	http_request=request_header_lines[0]
	print(http_request+"\r\n")
	get_file_name=re.match("[^/]+(/[^ ]*)",http_request).group(1)
	print(get_file_name)

	if get_file_name=="/":
		get_file_name=DOCUMENTS_ROOT+"/index.html"
	else:
		get_file_name=DOCUMENTS_ROOT+get_file_name
	print("file name is ===2>%s"%get_file_name)
	response_headers=""
	response_body=""
	try:
		f=open(get_file_name,"rb")
	except IOError:
		response_headers="HTTP/1.1 404 not found\r\n"
		response_headers+="Server:PythonWebServer2.0"
		response_headers+="\r\n"
		response_body="=====sorry,file not found===="

	else:
		response_headers="HTTP/1.1 200 OK\r\n"
		response_headers+="Server:PythonWebServer1.0\r\n"
		response_headers+="Content-Type: text/html;charset=utf-8\r\n"
		response_headers+="\r\n"
		response_body=f.read()
		f.close()
		
	finally:
		print(response_headers)
		print(response_body)
		print(type(response_headers))
		print(type(response_body))
		response=str(response_headers)+str(response_body)
		print(response)
		client_socket.send(response.encode("utf-8"))
		client_socket.close()





def main():
	TCP_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
	#设置当前服务器先close 即服务器端4次握手后资源能立即释放,这样就保证了,下次运行程序时可以立即绑定端口
	TCP_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
	TCP_socket.bind(("",7788))
	TCP_socket.listen(128)
	while True:
		client_socket =TCP_socket.accept()
		client_addr=client_socket[1]
		client_socket=client_socket[0]
		try:
			handle_client(client_socket)
		except Exception as e:
			print(e)

		

main()

在这里插入图片描述
可以根据URL访问需要的文件

多进程

import socket
import re
import multiprocessing

SERVER_ADDR=(HOST,PORT)="",8888
DOCUMENTS_ROOT="html"

class HTTPServer(object):
	"""docstring for HTTPServer"""
	def __init__(self, server_address):
		self.listen_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
		self.listen_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
		self.listen_socket.bind(server_address)
		self.listen_socket.listen(128)
		

	def server_forever(self):
		
		while True:
			
			client_socket=self.listen_socket.accept()
			client_address=client_socket[1]
			client_socket=client_socket[0]
			print(client_socket)
			new_process=multiprocessing.Process(target=self.handleRequest,args=(client_socket,))
			new_process.start()
			client_socket.close()
		


	def handleRequest(self,client_socket):

		recv_data=client_socket.recv(1024).decode('utf-8')
		requestHeaderLines=recv_data.splitlines()
		for line in requestHeaderLines:
			print(line)
		request_line=requestHeaderLines[0]

		
		get_file_name=re.match("[^/]+(/[^ ]*)",request_line).group(1)
		print("file_name is ===>%s"%get_file_name)

		if get_file_name=="/":
			get_file_name=DOCUMENTS_ROOT+"/123.txt"

		else:
			get_file_name=DOCUMENTS_ROOT+get_file_name

		print("file_name is ===>%s"%get_file_name)

		try:
			f=open(get_file_name,"rb")
		except Exception as e:
			print("open fail")
			response_header="HTTP/1.1 404 not found\r\n"
			response_header+="Server:PythonWebServer 3.0\r\n"
			response_header+="Content-Type: text/html;charset=utf-8\r\n"
			response_header+="\r\n"
			response_body="====sorry,file not found"
		else:
			response_header="HTTP/1.1 200 OK \r\n"
			response_header+="Server: PythonWebServer 3.0\r\n"
			response_header+="Content-Type: text/html;charset=utf-8\r\n"
			response_header+="\r\n"
			response_body=f.read()
			f.close()

		finally:
			respose=str(response_header)+str(response_body)
			print(response_header)
			print(response_body)
			print(respose)
			print(type(response_header))
			print(type(response_body))
			print(type(respose))
			client_socket.send(respose.encode("utf-8"))
			client_socket.close()



def main():

	httpd=HTTPServer(SERVER_ADDR)
	print("Web Server: Serving HTTP on PORT %d.....\n"%PORT)
	httpd.server_forever()

if __name__=="__main__":
	 main()

多线程

import socket
import re
import threading

ROOT='html'
SERVER_ADDRESS=(HOST,PORT)="",8888

class HTTOServer(object):
	def __init__(self,server_address):
		self.listen_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
		#允许立即使用上次绑定的Port
		self.listen_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
		#绑定
		self.listen_socket.bind(server_address)
		#变为被动,并指定 队列的长度
		self.listen_socket.listen(128)
		print("初始化完成")

	def server_forever(self):
		#循环运行web服务器,等待客户端的链接并为客户端服务
		print("启动服务")
		while True:
			client_socket=self.listen_socket.accept()
			client_address=client_socket[1]
			client_socket=client_socket[0]
			print(client_address)
			#创建一个单独的线程为一个客户端服务
			new_thd=threading.Thread(target=self.handleRequest,args=(client_socket,))
			new_thd.start()
			#因为线程是同享一个嵌套字,所以主线程不能关闭

	def handleRequest(self,client_socket):
		#用一个新的的线程为客户端服务
		recv_data=client_socket.recv(1024).decode("utf-8")
		print(recv_data)
		requstHeaderLines=recv_data.splitlines()
		for line in requstHeaderLines:
			print(line)
		if requstHeaderLines:
			requst_line=requstHeaderLines[0]
			get_file_name=re.match("[^/]+(/[^ ]*)",requst_line).group(1)
			print("file name is ====>%s"%get_file_name)
			if get_file_name=="/":
				get_file_name=ROOT+"/123.txt"
			else:
				get_file_name=ROOT+get_file_name
			print("file name is ====>%s"%get_file_name)
			try:
				f=open(get_file_name,"rb")

			except Exception as e:
				response_header="HTTP/1.1 404 not found \r\n"
				response_header+="Server:PythonWebServer 3.0\r\n"
				response_header+="Content-Type: text/html;charset=utf-8\r\n"
				response_header+="\r\n"
				response_body="===sorry,file not found ===="

			else:
				response_header="HTTP/1.1 200 OK \r\n"
				response_header+="Server:PythonWebServer 3.0\r\n"
				response_header+="Content-Type: text/html;charset=utf-8\r\n"
				response_header+="\r\n"
				response_body=f.read()
				f.close()

			finally:
				client_socket.send(response_header.encode("utf-8"))
				client_socket.send(response_body)
				client_socket.close()




def main():
	httpserver=HTTOServer(SERVER_ADDRESS)
	print("web Server : Serving HTTP on port %d"%PORT)
	httpserver.server_forever()


if __name__=="__main__":
	main()

服务器Gevent (协程)

import socket
import re
import threading

ROOT='html'
SERVER_ADDRESS=(HOST,PORT)="",8888

class HTTOServer(object):
	def __init__(self,server_address):
		self.listen_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
		#允许立即使用上次绑定的Port
		self.listen_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
		#绑定
		self.listen_socket.bind(server_address)
		#变为被动,并指定 队列的长度
		self.listen_socket.listen(128)
		print("初始化完成")

	def server_forever(self):
		#循环运行web服务器,等待客户端的链接并为客户端服务
		print("启动服务")
		while True:
			client_socket=self.listen_socket.accept()
			client_address=client_socket[1]
			client_socket=client_socket[0]
			print(client_address)
			#创建一个单独的线程为一个客户端服务
			new_thd=threading.Thread(target=self.handleRequest,args=(client_socket,))
			new_thd.start()
			#因为线程是同享一个嵌套字,所以主线程不能关闭

	def handleRequest(self,client_socket):
		#用一个新的的线程为客户端服务
		recv_data=client_socket.recv(1024).decode("utf-8")
		print(recv_data)
		requstHeaderLines=recv_data.splitlines()
		for line in requstHeaderLines:
			print(line)
		if requstHeaderLines:
			requst_line=requstHeaderLines[0]
			get_file_name=re.match("[^/]+(/[^ ]*)",requst_line).group(1)
			print("file name is ====>%s"%get_file_name)
			if get_file_name=="/":
				get_file_name=ROOT+"/123.txt"
			else:
				get_file_name=ROOT+get_file_name
			print("file name is ====>%s"%get_file_name)
			try:
				f=open(get_file_name,"rb")

			except Exception as e:
				response_header="HTTP/1.1 404 not found \r\n"
				response_header+="Server:PythonWebServer 3.0\r\n"
				response_header+="Content-Type: text/html;charset=utf-8\r\n"
				response_header+="\r\n"
				response_body="===sorry,file not found ===="

			else:
				response_header="HTTP/1.1 200 OK \r\n"
				response_header+="Server:PythonWebServer 3.0\r\n"
				response_header+="Content-Type: text/html;charset=utf-8\r\n"
				response_header+="\r\n"
				response_body=f.read()
				f.close()

			finally:
				client_socket.send(response_header.encode("utf-8"))
				client_socket.send(response_body)
				client_socket.close()




def main():
	httpserver=HTTOServer(SERVER_ADDRESS)
	print("web Server : Serving HTTP on port %d"%PORT)
	httpserver.server_forever()


if __name__=="__main__":
	main()


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值