在底层创建socket并且封装一个HTTP功能
一、TCP回顾
1.TCP的创建及使用
from socket import *
def run_one():
#创建一个TCP/socket连接
socketServer = socket(AF_INET, SOCK_STREAM)
# 绑定ip和端口号
socketServer.bind(('', 8088))
# 监听端口
socketServer.listen(128)
# 接受一个客户端的字节套(内容)
client_socket,clientAdr = socketServer.accept()
# 接受到的连接信息
print(client_socket)
# 接收到的客户端地址
print(clientAdr)
# 接收对方发送过来的数据
recv_data = client_socket.recv(1024).decode('gbk') # 接收1024个字节
# 获取头的访问连接一个get传参
data_url = recv_data.splitlines()[0].strip(' ')[1]
print('接收到的数据为:{},访问的功能为{}'.format(recv_data,data_url))
# 定义响应头
res_handle = 'HTTP/1.1 200 ok\n'
res_handle += 'Content-Type:text/html;charset=utf-8\n\n'
res_body = '水哥牛逼'.encode('utf8')
# 发送数据到客户端(字节套/二进制编码)
client_socket.send(res_handle.encode('utf8'))
client_socket.send(res_body)
if __name__ == '__main__':
run_one()
二、使用TCP/socket封装一个HTTP功能
1.封装socket
import socket
from multiprocessing.context import Process
from ulit.response import response
class httpd(object):
def __init__(self, socketIp, socketServ, connNumber):
# 定义IP地址
self.socketIp = socketIp
# 定义端口
self.socketServ = socketServ
# 定义最大连接等待数
self.connNumber = connNumber
# 新建TCP连接
self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 使用setsockopt保留端口
self.server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 绑定ip端口
self.server.bind((socketIp, socketServ))
# 监听请求
self.server.listen(128)
# 一直开启服务监听接受客户端返回的字节套
def run_forever(self):
while True:
# 接受一个客户端的连接请求,并返回一个新的套接字
clientSocket, clientAdre = self.server.accept()
# 添加一个进程,给这个进程客户端资源
p = Process(target=self.server_run, args=(clientSocket, clientAdre))
# 运行server方法
p.start()
# 关闭单个客户端的字节套连接,接收下一个
clientSocket.close()
# 运行server
def server_run(self, socket, adress):
resData = socket.recv(1024).decode('utf-8')
# print(resData)
data = unquote(resData.splitlines()[0].split(' ')[1],encoding='utf8')
# print(data)
if len(data.split('?')) > 1:
dataPort = data.split('?')[0]
reqData = {data.split('?')[1].split('=')[0]: data.split('?')[1].split('=')[1]}
print(dataPort, reqData)
socket.send(application(dataPort, adress, reqData))
# return True
else:
socket.send(application(data, adress))
print('111')
# return True
if __name__ == '__main__':
server = httpd('0.0.0.0', 8083, 128)
server.run_forever()
来源:CSDN
作者:花哨丶
链接:https://blog.csdn.net/qq_42932046/article/details/104779341