Python—在底层创建socket并且封装一个HTTP功能

三世轮回 提交于 2020-03-11 01:02:29

一、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()
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!