Python:socket客户端、服务端、web请求相关

socket

客户端

import socket

if __name__ == '__main__':
    # 创建socket连接对象 AF_INET:采用IPV4 SOCK_STREAM:传输协议
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 连接服务器
    client_socket.connect(("172.0.0.1", 8081))
    # 发送信息
    client_socket.send("nihao".encode(encoding="utf-8"))
    # 接受消息
    recv_data = client_socket.recv(1024)
    # 关闭连接
    client_socket.close()

服务端

import socket
import threading

def handle_client(conn):
    # 接受客户端数据
    recv_data = conn.recv(1024)
    print("客户端发送:", recv_data.decode(encoding="utf-8"))
    # 发送信息给客户端
    conn.send("服务端接收到了信息".encode(encoding="utf-8"))
    conn.close()

if __name__ == '__main__':
    # 创建服务端连接对象
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 设置端口复用,防止关闭服务后在启动报错
    server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
    # 绑定ip与端口
    server_socket.bind(("", 8888))
    # 设置监听
    server_socket.listen(128)

    while True:
        # 接受客户端连接
        conn, ip_port = server_socket.accept()
        # 线程处理多任务
        task_thread = threading.Thread(target=handle_client, args=conn)
        task_thread.start()

    # 关闭连接
    server_socket.close()

socket返回html页面内容

# -*- coding:utf-8 -*-

import socket

if __name__ == '__main__':
    # 创建socket对象
    server_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 设置端口复用
    server_client.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
    # 绑定端口
    server_client.bind(("", 8080))
    # 监听请求
    server_client.listen(128)

    while True:
        # 接受请求
        client_conn, client_addr = server_client.accept()
        # 获取浏览器请求数据
        recv_data = client_conn.recv(8096).decode("utf-8")
        print(recv_data)

        # 读取要返回的页面内容
        with open("C:/Users/huangkun/Desktop/1.html", "rb") as f:
            read_data = f.read()

        # 应答行
        res_line = "HTTP/1.1 200 OK \r\n"
        # 应答头
        res_header = "Server:pwd\r\n"
        # 应答体
        res_body = read_data

        res_data = (res_line + res_header + "\r\n").encode() + res_body
        # 发送数据
        client_conn.send(res_data)
        # 关闭请求
        client_conn.close()

浏览器输入http://127.0.0.1:8080/即可查看socket返回的页面内容

socket返回指定页面内容

# -*- coding:utf-8 -*-

import socket

if __name__ == '__main__':
    # 创建socket对象
    server_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 设置端口复用
    server_client.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
    # 绑定端口
    server_client.bind(("", 8080))
    # 监听请求
    server_client.listen(128)

    while True:
        # 接受请求
        client_conn, client_addr = server_client.accept()
        # 获取浏览器请求数据
        recv_data = client_conn.recv(8096).decode("utf-8")
        print(recv_data)

        # 解析浏览器路径
        recv_list = recv_data.split(" ")
        page_name = recv_list[1]
        if page_name == "/":
            page_name = "1.html"

        try:
            with open("C:/Users/huangkun/Desktop/" + page_name, "rb") as f:
                read_data = f.read()
        except Exception as e:
            # 应答行
            res_line = "HTTP/1.1 404 Not Found \r\n"
            # 应答头
            res_header = "Server:pwd\r\n"
            # 应答体
            res_body = "404 Not Found"

            res_data = (res_line + res_header + "\r\n" + res_body).encode()
            # 发送数据
            client_conn.send(res_data)
        else:
            # 应答行
            res_line = "HTTP/1.1 200 OK \r\n"
            # 应答头
            res_header = "Server:pwd\r\n"
            # 应答体
            res_body = read_data

            res_data = (res_line + res_header + "\r\n").encode() + res_body
            # 发送数据
            client_conn.send(res_data)

        # 关闭请求
        client_conn.close()

根据浏览器输入的页面内容进行返回,不存在则返回404

socket获取指定页面内容,多线程版本

# -*- coding:utf-8 -*-

import socket
import threading

def client_thread(client_conn):
    # 获取浏览器请求数据
    recv_data = client_conn.recv(8096).decode("utf-8")
    print(recv_data)

    # 解析浏览器路径
    recv_list = recv_data.split(" ")

    if len(recv_list) == 1:
        client_conn.close
        return 

    page_name = recv_list[1]
    if page_name == "/":
        page_name = "1.html"

    try:
        with open("C:/Users/huangkun/Desktop/" + page_name, "rb") as f:
            read_data = f.read()
    except Exception as e:
        # 应答行
        res_line = "HTTP/1.1 404 Not Found \r\n"
        # 应答头
        res_header = "Server:pwd\r\n"
        # 应答体
        res_body = "404 Not Found"

        res_data = (res_line + res_header + "\r\n" + res_body).encode()
        # 发送数据
        client_conn.send(res_data)
    else:
        # 应答行
        res_line = "HTTP/1.1 200 OK \r\n"
        # 应答头
        res_header = "Server:pwd\r\n"
        # 应答体
        res_body = read_data

        res_data = (res_line + res_header + "\r\n").encode() + res_body
        # 发送数据
        client_conn.send(res_data)

    # 关闭请求
    client_conn.close()

if __name__ == '__main__':
    # 创建socket对象
    server_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 设置端口复用
    server_client.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
    # 绑定端口
    server_client.bind(("", 8080))
    # 监听请求
    server_client.listen(128)

    while True:
        # 接受请求
        client_conn, client_addr = server_client.accept()

        multi_task = threading.Thread(target=client_thread, args=(client_conn,))
        multi_task.start()

socket获取指定页面内容,面向对象封装

# -*- coding:utf-8 -*-

import socket
import threading

class HttpClientServer:
    def __init__(self):
        # 创建socket对象
        self.server_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        # 设置端口复用
        self.server_client.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
        # 绑定端口
        self.server_client.bind(("", 8080))
        # 监听请求
        self.server_client.listen(128)

    def client_thread(self, client_conn):
        # 获取浏览器请求数据
        recv_data = client_conn.recv(8096).decode("utf-8")
        print(recv_data)

        # 解析浏览器路径
        recv_list = recv_data.split(" ")

        if len(recv_list) == 1:
            client_conn.close
            return

        page_name = recv_list[1]
        if page_name == "/":
            page_name = "1.html"

        try:
            with open("C:/Users/huangkun/Desktop/" + page_name, "rb") as f:
                read_data = f.read()
        except Exception as e:
            # 应答行
            res_line = "HTTP/1.1 404 Not Found \r\n"
            # 应答头
            res_header = "Server:pwd\r\n"
            # 应答体
            res_body = "404 Not Found"

            res_data = (res_line + res_header + "\r\n" + res_body).encode()
            # 发送数据
            client_conn.send(res_data)
        else:
            # 应答行
            res_line = "HTTP/1.1 200 OK \r\n"
            # 应答头
            res_header = "Server:pwd\r\n"
            # 应答体
            res_body = read_data

            res_data = (res_line + res_header + "\r\n").encode() + res_body
            # 发送数据
            client_conn.send(res_data)

        # 关闭请求
        client_conn.close()

    def start(self):
        while True:
            # 接受请求
            client_conn, client_addr = self.server_client.accept()

            multi_task = threading.Thread(target=self.client_thread, args=(client_conn,))
            multi_task.start()

if __name__ == '__main__':
    http_client = HttpClientServer()
    http_client.start()

socket命令行启动,并且传参端口号

# -*- coding:utf-8 -*-

import socket
import threading
import sys

class HttpClientServer:
    def __init__(self, port):
        # 创建socket对象
        self.server_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        # 设置端口复用
        self.server_client.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
        # 绑定端口
        self.server_client.bind(("", int(port)))
        # 监听请求
        self.server_client.listen(128)

    def client_thread(self, client_conn):
        # 获取浏览器请求数据
        recv_data = client_conn.recv(8096).decode("utf-8")
        print(recv_data)

        # 解析浏览器路径
        recv_list = recv_data.split(" ")

        if len(recv_list) == 1:
            client_conn.close
            return

        page_name = recv_list[1]
        if page_name == "/":
            page_name = "1.html"

        try:
            with open("C:/Users/huangkun/Desktop/" + page_name, "rb") as f:
                read_data = f.read()
        except Exception as e:
            # 应答行
            res_line = "HTTP/1.1 404 Not Found \r\n"
            # 应答头
            res_header = "Server:pwd\r\n"
            # 应答体
            res_body = "404 Not Found"

            res_data = (res_line + res_header + "\r\n" + res_body).encode()
            # 发送数据
            client_conn.send(res_data)
        else:
            # 应答行
            res_line = "HTTP/1.1 200 OK \r\n"
            # 应答头
            res_header = "Server:pwd\r\n"
            # 应答体
            res_body = read_data

            res_data = (res_line + res_header + "\r\n").encode() + res_body
            # 发送数据
            client_conn.send(res_data)

        # 关闭请求
        client_conn.close()

    def start(self):
        while True:
            # 接受请求
            client_conn, client_addr = self.server_client.accept()

            multi_task = threading.Thread(target=self.client_thread, args=(client_conn,))
            multi_task.start()

if __name__ == '__main__':

    if len(sys.argv) == 2 and sys.argv[1].isdigit():
        port = sys.argv[1]
        http_client = HttpClientServer(port)
        http_client.start()
    else:
        print("参数错误")

使用sys.argv接受命令行参数,命令行执行命令如下:

python socket多任务命令行启动.py 8080

每天进步一点点,共勉~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值