计网自顶向下(多线程Web代理服务器)

news2024/11/25 13:13:14

目录

🌼前言

🌼多线程Web代理服务器

🎒过程

🏀解释

🌳代码


🌼前言

前置知识

(1)进程 与 线程

进程与线程的一个简单解释 - 阮一峰的网络日志 (ruanyifeng.com)

(2) 多线程

撬开多线程的大门——学习多线程必须掌握的基本概念 - 姜承轩 - 博客园 (cnblogs.com)

🌼多线程Web代理服务器

🎒过程

注意!先用原端口(就是初始能上网的端口),先不要切8899端口,打开 gaia.cs 网页

然后,对应目录下打开 cmd,py    .py    代码,出现ready to serve... 后

再切 8899 端口,然后刷新(打乱步骤无法出现预期结果

(1)配置浏览器

这里最好把端口改成8899或者其他的,如果按你原来的端口来改代码中的 port ,很可能出现端口被占用的情况,那么打开网页后,cmd中没有反应

 (2)运行对应目录的 .py 代码

(3)打开网页

http://gaia.cs.umass.edu/wireshark-labs/INTRO-wireshark-file1.html

与此同时,cmd中显示👇

卡在了 hostname

Ready to serve...
Received a connection from:  ('127.0.0.1', 50213)
File Exist:  false
Creating socket on proxyserver
Host Name:
Illegal request

貌似 Edge 不行,得切 IE 浏览器👇(不切貌似也能用)

a. 

Microsoft Edge
b. edge浏览器internet选项灰色怎么办?-edge浏览器internet选项灰色无法使用的解决方法 - 极光下载站 (xz7.com)

2次 Host Nameillegal request 后成功了

(4)同一目录下出现缓存的 网页文件,记事本打开

内容包括 响应头 和 正文

注意,切 8899 端口后,浏览器打开其他网页都连接不上,因为默认占用原来的端口号来打开网页,需要重新切回去才能上网( (5)开始前,可以切回 8899 端口 ) 

(5)重新打开个 cmd,运行 .py,然后刷新 gaia.cs 网址,cmd显示👇

🏀解释

进一步注释,看代码

(1) socket()函数的两个参数

  • AF_INET:指定使用IPv4地址族,用于TCP/IP网络
  • SOCK_STREAM:指定使用流式套接字,用于可靠的、基于连接的通信
# 创建TCP套接字
tcpSerSock = socket(AF_INET, SOCK_STREAM)
 

(2) bind()函数的两个参数解释如下:

  • '':表示将服务器绑定到所有可用的网络接口上
  • tcpSerPort:指定要绑定的端口号
# 将套接字绑定到指定的地址和端口 
tcpSerSock.bind(('', tcpSerPort))

(3) 浏览器是客户端,而.py在cmd中扮演服务器的角色的原因是,浏览器是一个HTTP客户端,负责发送HTTP请求给服务器,并接收服务器的响应。而代码中创建的服务器是一个TCP服务器,它监听指定的端口,接受来自客户端(例如浏览器)的连接请求,并向客户端发送响应

(4) tcpCliSock是一个新的套接字对象,用于与客户端进行通信。addr是客户端的地址信息。

tcpCliSock, addr = tcpSerSock.accept()

(5)

  • message.split()[1]:将接收到的消息按空格分割,取第二部分,即HTTP请求中的路径部分
  • .partition("//")[2]:将路径部分按"//"分割,取第三部分,即主机名部分
  • .replace('/', '_'):将主机名中的斜杠替换为下划线
filename = message.split()[1].partition("//")[2].replace('/', '_')
 

(6) fileExist = "false"用于标记文件是否存在。在后续的判断中,如果该值为"false",则说明文件不存在

(7) tryexcept IOError用于异常处理。在try代码块中尝试执行某个操作,如果在执行过程中发生了IOError异常(文件不存在等),则跳转到except代码块中进行相关处理

(8) open()函数用于打开文件,并返回一个文件对象。参数解释如下

  • filename:要打开的文件名。
  • "r":以只读模式打开文件。

(9) .readlines()方法用于从文件对象中读取所有行,并返回一个包含所有行的列表

(10) .send()方法用于发送数据。参数是要发送的数据

(11) .connect((hostn, 80))与远程服务器建立连接。参数是远程服务器的IP地址和端口号

(12) sendall(buff)方法用于将数据发送给客户端。buff是要发送的数据

(13) open('./' + filename, "w")用于创建并打开一个文件,以便写入数据。filename是文件名,"w"表示以写入模式打开文件

(14) .writelines()方法用于将字符串列表中的所有元素写入文件中。参数是要写入的字符串列表

🌳代码

#coding:utf-8
from socket import *

# 创建socket, 绑定到端口, 开始监听
tcpSerPort = 8899
tcpSerSock = socket(AF_INET, SOCK_STREAM) 
# AF_INET, IPv4地址簇, 用于TCP/IP
# SOCK_STREAM, 流式socket, 用于TCP


# Prepare a server socket
tcpSerSock.bind(('', tcpSerPort)) # Server地址和端口
tcpSerSock.listen(3) # 最大连接数

while True:
    # 开始从客户端接受请T求
    print('Ready to serve...baga!')
    tcpCliSock, addr = tcpSerSock.accept() # 新的套接字 和 客户端地址
    print('Received a connection from: ', addr) # 客户端地址 = IP地址 + 端口号 = 元组
    message = tcpCliSock.recv(4096).decode() # 接收字符串并解码

    # 从请求中解析出filename
    filename = message.split()[1].partition("//")[2].replace('/', '_')
    # 按空格分隔取第2部分; 按//分隔取第3部分; 把/替换为_
    fileExist = "false"

    # try 执行中遇到异常, 就执行except
    try:
        # 检查缓存中是否存在该文件
        f = open(filename, "r") # 只读方式打开文件
        outputdata = f.readlines() # 读取所有行并返回列表
        fileExist = "true"
        print('File Exists!')

        # 缓存中存在该文件,把它向客户端发送
        for i in range(0, len(outputdata)):
            tcpCliSock.send(outputdata[i].encode())
        print('Read from cache')
    
    # 缓存中不存在该文件,异常处理
    except IOError:
        print('File Exist: ', fileExist)

        if fileExist == 'false':
            # 在代理服务器上创建一个tcp socket
            print('Creating socket on proxyserver')
            c = socket(AF_INET, SOCK_STREAM)

            # 解析请求消息中的主机名
            hostn = message.split()[1].partition("//")[2].partition("/")[0]
            # 按空格分隔取第2部分; 按//分隔取第3部分; 按/分隔取第1部分
            print('Host Name: ', hostn)

            try:
                # 连接到远程服务器80端口
                c.connect((hostn, 80)) # ip 和 端口
                print('Socket connected to port 80 of the host')

                # 请求信息发送到远程服务器
                c.sendall(message.encode())

                # Read the response into buffer
                # 从远程服务器读取响应信息
                buff = c.recv(4096)

                # 发送响应信息到客户端socket
                tcpCliSock.sendall(buff)

                # 缓存cache中创建并写入请求文件的副本
                tmpFile = open("./" + filename, "w") # 只写方式打开文件
                # 解码后替换\r\n为\n
                tmpFile.writelines(buff.decode().replace('\r\n', '\n'))
                tmpFile.close() # 关闭文件

            except:
                # HTTP response message for file not found
                print("Illegal request")
            # Close the client and the server sockets
            tcpCliSock.close() # 关闭 Client socket
tcpSerSock.close() # 关闭 Server socket

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1350078.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机组成原理 数据的表示与运算

文章目录 数据的表示与运算数据表示定点数的表示与运算定点数的表示无符号数有符号数定点整数定点小数四码反码补码移码 总结 定点数的运算算术移位原码反码补码总结 逻辑位移循环位移总结 加减运算原码加减法补码加减法 溢出判断采用一位符号位 浮点数的表示与运算表示IEEE 75…

【排序算法】【二叉树】【滑动窗口】LeetCode220: 存在重复元素 III

作者推荐 【二叉树】【单调双向队列】LeetCode239:滑动窗口最大值 本文涉及的基础知识点 C算法&#xff1a;滑动窗口总结 题目 给你一个整数数组 nums 和两个整数 indexDiff 和 valueDiff 。 找出满足下述条件的下标对 (i, j)&#xff1a; i ! j, abs(i - j) < indexDi…

2024校招测试工程师笔试——经典错题记录和解析

大家好&#xff0c;这篇文章记录几个测开方向经典的例题&#xff0c;并给出相应解析&#xff0c;欢迎给出你的看法 下列关于软件性能测试的说法中&#xff0c;正确的是&#xff1a;&#xff08; &#xff09; A 性能测试的目的不是为了发现软件缺陷 B 压力测试与负载测试的目的…

Ansible自动化运维(一)简介及部署、清单

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…

腾讯云轻量应用服务器“镜像”如何选择比较好?

腾讯云轻量应用服务器镜像怎么选择&#xff1f;镜像是指轻量服务器的操作系统&#xff0c;可以选择宝塔Linux面板8.0.4腾讯云专享版&#xff0c;如果需要Win系统建议选择Windows Server 2012 R2 中文版&#xff0c;腾讯云服务器网txyfwq.com分享腾讯云轻量应用服务器镜像操作系…

如何使用Pyxamstore快速解析Xamarin AssemblyStore文件

关于Pyxamstore Pyxamstore是一款针对Xamarin AssemblyStore文件&#xff08;assemblies.blob&#xff09;的强大解析工具&#xff0c;该工具基于纯Python 2.7开发&#xff0c;支持从一个APK文件中解包并重封装assemblies.blob和assemblies.manifest Xamarin文件。 什么是ass…

谷歌Gemini Pro模型 Api 调用

写在前面 本篇博客主要介绍如下内容 Gemini Pro模型 ApiKey的申请 Gemini Pro模型 Api调用的方法 几个模型Api调用的demo程序 调用Gemini Pro模型中可能遇到的问题及解决方案 模型 ApiKey的申请 注册好Google账号&#xff0c;并在浏览器完成登录访问 : https://makersuite.g…

低成本TB级数据库技术选型之思考两三点

一、背景 前段时间在搞毕业论文的选题&#xff0c;最头疼的就是大量的文献检索和阅读&#xff0c;从研究的角度上我们可以将文献分为四类&#xff1a; 理论文献&#xff1a;为研究提供理论的框架和基础的文献。这些文献可能并不会和所做的研究直接相关&#xff0c;甚至由于理…

梦里河山:自在正定,跨年寄语

‍ ‍雏鹰高飞&#xff0c;我们也渐渐失去了新年第一天去香炉峰顶祈福的动力。向往着梦里河山&#xff0c;于是启动了这次的跨年之旅。 雾途 放假的第一天&#xff0c;早早起床&#xff0c;7点钟开车驱往赵子龙的故乡——正定。万万没有想到&#xff0c;出了五环&#xff0c;晨…

老品牌新玩法?经济内循环下逆势开出100多家门店,他被央视青睐!

2023年12月26日&#xff0c;CCTV-2整点财经栏目以“抢抓复苏机遇&#xff0c;连锁品牌主打新活力”为主题&#xff0c;播报我国老品牌发展现状&#xff0c;新消费时代以来&#xff0c;消费者的选择多样化、分众化、小众化、个性化&#xff0c;给“老品牌”发展带来前所未有的挑…

计算机毕业设计——SpringBoot社区物业管理系统(附源码)

1&#xff0c; 概述 1.1 课题背景 近几年来&#xff0c;随着物业相关的各种信息越来越多&#xff0c;比如报修维修、缴费、车位、访客等信息&#xff0c;对物业管理方面的需求越来越高&#xff0c;我们在工作中越来越多方面需要利用网页端管理系统来进行管理&#xff0c;我们…

Java商城 免 费 搭 建:鸿鹄云商实现多种商业模式,VR全景到SAAS,应有尽有

鸿鹄云商 b2b2c产品概述 【b2b2c平台】&#xff0c;以传统电商行业为基石&#xff0c;鸿鹄云商支持“商家入驻平台自营”多运营模式&#xff0c;积极打造“全新市场&#xff0c;全新 模式”企业级b2b2c电商平台&#xff0c;致力干助力各行/互联网创业腾飞并获取更多的收益。从消…

Vue-响应式数据

一、ref创建基本类型的响应式数据 vue3可以使用ref、reactive去定义响应式数数据。 知识点汇总 使用ref需要先引入ref&#xff0c;import {ref} from vue在模板 template 中使用了添加ref 的响应式数据&#xff0c;变量的后面不用添加.value所有js代码里面&#xff0c;去操作r…

Python进行批量字符替换的3种方法

一、问题的提出 之前&#xff0c;我写过一篇如何在word中计算数学算式&#xff1a; 如何用Python批量计算Word中的算式-CSDN博客 为了计算算式&#xff0c;就需要对算式进行格式化&#xff0c;把不规则的算式转换成规则的算式&#xff0c;这时就会涉及到一些字符的批量替换。…

Spring见解 1

1.Spring概述 1.1.Spring介绍 ​ Spring是轻量级Java EE应用开源框架&#xff08;官网&#xff1a; http://spring.io/ &#xff09;&#xff0c;它由Rod Johnson创为了解决企业级编程开发的复杂性而创建 1.2.简化应用开发体现在哪些方面&#xff1f; IOC 解决传统Web开发中…

uni-app App.vue生命周期全局样式全局存储globalData

锋哥原创的uni-app视频教程&#xff1a; 2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中...共计23条视频&#xff0c;包括&#xff1a;第1讲 uni…

小企业是否应该采用SD-WAN组网?

在当今数字化时代&#xff0c;企业成功的关键之一是建立稳定高效的网络连接。无论企业规模大小如何&#xff0c;网络都是实现高效运营和达成业务目标的重要组成部分。对于小企业而言&#xff0c;考虑成本效益和资源管理显得尤为重要。那么&#xff0c;对于小企业来说&#xff0…

Rust赋值语句和数字类型

赋值语句 在Rust中&#xff0c;使用let关键字定义变量。格式是let 变量名:变量类型 变量值;&#xff0c;下边是个例子&#xff1a; let age:i32 18;这就是定义一个有符号32位的数字变量age&#xff0c;而其中的值是18。 而在C语言定义变量的语句格式是类型 变量名 变量值。…

2023年“中银杯”安徽省网络安全B模块(部分解析)

前言 以下是2023年中银杯安徽省网络安全B模块题目&#xff0c;镜像可以私聊我 B模块安全事件响应/网络安全数据取证/应用安全&#xff08;400 分&#xff09; B-1&#xff1a;CMS网站渗透测试 任务环境说明&#xff1a; √服务器场景&#xff1a;Server2206&#xff08;关…

详解动态顺序表

&#x1d649;&#x1d65e;&#x1d658;&#x1d65a;!!&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦ &#x1f44f;&#x1f3fb;‧✧̣̥̇:Solitary-walk ⸝⋆ ━━━┓ - 个性标签 - &#xff1a;来于“云”的“羽球人”。…