tcp的Http应用:Http2.0版本的创建

本文介绍了一个基于Python实现的HTTP服务器V2.0版本,该版本采用了多线程并发来处理客户端请求,并且能够解析并响应静态网页及简单数据请求。通过封装HTTPServer类,实现了更简洁的服务端代码。
  • HTTP V2.0
HTTP V1.0
	1. 接收客户端请求
	2. 解析客户端请求
	3. 组织数据,形成HTTP response
	4. 将数据发送给客户端

升级: V2.0
	1. 采用多线程并发接收多个客户端请求
	2. 基本的请求解析,根据请求返回相应的内容
	3. 除了可以请求静态网页,也可以请求简单的数据
	4. 将功能封装在一个类中
  • 技术点
 - socket tcp套接字
 - http协议的请求响应格式
 - 线程并发的创建方法
 - 类的基本使用
  • 服务端具体代码
#!/usr/bin/python3
#-*- coding = utf-8 -*-

'''
http server v2.0
1.多线程并发
2.可以请求简单数据
3.能进行简单请求解析
4.结构使用类进行封装
'''

from socket import *
from threading import Thread
import sys
import traceback

#httpserver类,封装具体的服务器功能
class HTTPServer(object):
	def __init__(self,server_addr,static_dir):
		#增添服务器对象属性
		self.server_address = server_addr
		self.static_dir = static_dir
		self.ip = server_addr[0]
		self.port = server_addr[1]
		#创建套接字
		self.create_socket()

	def create_socket(self):
		self.sockfd = socket()
		self.sockfd.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
		self.sockfd.bind(self.server_address)


	#设置监听,等待客户端连接
	def server_forever(self):
		self.sockfd.listen(5)
		print('listen the port {}'.format(self.port))

		while True:
			try:
				connfd,addr = self.sockfd.accept()
			except KeyboardInterrupt:
				self.sockfd.close()
				sys.exit('服务器退出')
			except Exception as e:
				traceback.print_exc()
				continue

			#创建新的线程处理请求
			client_thread = Thread\
			(target = self.handleRequest,args=(connfd,))
			client_thread.setDaemon(True) # 在start之前使用,将子线程设置为守护线程
			client_thread.start()
			
	#客户端请求函数
	def handleRequest(self,connfd):
		
		#接受客户端请求
		request = connfd.recv(4096)
		
		#解析请求内容
		requestHeaders = request.splitlines()
		print(connfd.getpeername(),':{}'.format(requestHeaders[0]))
		
		#获得具体请求内容
		getRequest = requestHeaders[0].decode().split(' ')[1]
		
		if getRequest == '/' or getRequest[-5:] == '.html':
			self.get_html(connfd,getRequest)
		else:
			self.get_data(connfd,getRequest)

		connfd.close()

	#获取静态html的方法
	def get_html(self,connfd,getRequest):
		if getRequest == '/':
			filename = '/index.html'
		else:
			filename = getRequest
		
		try:
			fr = open(self.static_dir+filename,'r')
		except Exception as e:
			responseHeaders = 'HTTP/1.1 404 NOT FOUND\r\n'
			responseHeaders += '\r\n'
			responseBody = 'Sorry,not found the page'
			print(e)
		else:
			responseHeaders = 'HTTP/1.1 404 NOT FOUND\r\n'
			responseHeaders += '\r\n'
			#print('{} get the page:{}'.format(connfd.getpeername(),filename[1:]))
			responseBody = fr.read()
		finally:
			response = responseHeaders + responseBody
			connfd.send(response.encode())

	#发送其他种类的数据
	def get_data(self,connfd,getRequest):
		#设置请求内容格式为/time 或者/python
		urls = ['/time','/python']

		if getRequest in urls:
			responseHeaders = 'HTTP/1.1 404 NOT FOUND\r\n'
			responseHeaders += '\r\n'
			if getRequest == '/time':
				import time
				responseBody = time.ctime()
			elif getRequest == '/python':
				responseBody = '人生苦短我用大蛇'
		else:
			responseHeaders = 'HTTP/1.1 404 NOT FOUND\r\n'
			responseHeaders += '\r\n'
			responseBody = 'Sorry,not found the page'

		response = responseHeaders + responseBody
		connfd.send(response.encode())




if __name__ == '__main__':
	#服务器IP
	server_addr = ('0.0.0.0',8888)
	#我的静态页面存储目录
	static_dir = './html'

	#生成对象
	https = HTTPServer(server_addr,static_dir)

	#启动服务器
	https.server_forever()
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值