python模拟简单浏览器以及Web服务器

1.模拟浏览器

"""
1. 导入模块
2. 创捷套接字
3. 建立连接
4. 拼接请求协议
5. 发送请求协议
6. 接收服务器响应内容
7. 保存内容
8. 关闭连接
"""

# 1. 导入模块
import socket

# 2. 创捷套接字
tcp_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 3. 建立连接
tcp_client.connect(("www.baidu.com", 80))  # web默认端口
# 4.拼接请求协议
# 请求协议:
# 1)请求行
request_line = 'GET / HTTP/1.1\r\n'
# 2)请求头
request_header = 'HOST :www.baidu.com\r\n'
# 3)请求空行
request_black = '\r\n'
# 整体拼接
request_data = request_line + request_header + request_black
# 5. 发送请求协议
# 请求报文默认字符串,需要编码成二进制
tcp_client.send(request_data.encode())
# 6.接收服务器响应内容
recv_data = tcp_client.recv(4096)  # 4096= KB
print(recv_data)
# 解码接收到的二进制数据
recv_text = recv_data.decode('')
print(recv_text)
# 7. 保存内容
# 查询位置\r\n\r\n
locations = recv_text.find('\r\n\r\n')
# 截取
loc_data = recv_text[locations:]
# 保存内容到文件
with open('index.html', 'w') as file:
    file.write(loc_data)
# 8. 关闭连接
tcp_client.close()

输出结果为接受到从百度服务器返回的响应报文

简单的web服务器

"""
TCP服务端
1.导入模块
2.创建套机字
3.绑定端口
4.设置地址重用
5.设置监听,主动边被动
6.接受客户端连接 定义函数
7.接受客户端发送的请求报文
8.判断协议是否为空
9.拼接响应的报文
10.发送响应报文
11.关闭套接字
"""


def request_handler(new_client_socket, ip_port):
    """
    接受信息并作出响应
    :return:
    """
    # 7.接受客户端发送的请求报文
    # 8.判断协议是否为空
    request_data = new_client_socket.recv(1024)
    # print(request_data)
    if not request_data:
        print('%s客户端已经下线!' % str(ip_port))
        new_client_socket.close()
        return
    # 9.拼接响应的报文
    # 相应行
    response_line = 'HTTP/1.1 200 OK\r\n'
    # 响应头
    response__header = 'Server:Python20WS/2.1\r\n'
    # 响应空行
    response_blank = '\r\n'
    # 响应主体
    response__body = 'HelloWorld!'
    # 连接成一个主体
    response__data = response_line + response__header + response_blank + response__body
    # 10.发送响应报文
    new_client_socket.send(response__data.encode())
    # 关闭当前连接
    new_client_socket.close()


def main():
    # 1.导入模块
    import socket
    # 2.创建套机字
    tcp_service_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 3.设置地址重用
    # SOL_SOCKET:当前套接字,SO_REUSEADDR:地址重用
    tcp_service_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
    # 4.绑定端口
    tcp_service_socket.bind(('', 8080))
    # 5.设置监听,主动边被动
    tcp_service_socket.listen(128)
    # 6.接受客户端连接定义函数
    while True:
        new_client_socket, ip_port = tcp_service_socket.accept()
        request_handler(new_client_socket, ip_port)
    # 11.关闭套接字
    #  tcp_service_socket.close()


if __name__ == '__main__':
    main()

Web服务器响应为‘helliworld’的报文主体,在浏览器中输入‘127.0.0.1:8080’ 即可查看到从服务器接受到的响应报文‘helloworld’.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值