Python3网络学习案例四:编写Web Proxy
代理服务器的定义和作用请走百度百科~
1. Web Proxy的实现思路
这是基于上一篇“编写Web Server”写的,主要逻辑见下图:

我们要写的就是中间的Web Proxy部分,当客户端向Web Proxy发送对某一个网址的访问请求(Request)时,Web Proxy会首先查看自己是否有该请求文件,如果有则直接返回(Response),如果没有,Web Proxy就要像Web Server(该访问网址的服务器)发送请求来获取目标文件,然后再向Client返回。
2. Web Proxy的使用
首先,我们在访问一个网址时为了通过代理访问就不能简单地打开浏览器输入网址进行访问(那样就变成Client直接向Web Server发送Reuest了),在这里可以下载一个名为Wget的工具,这个东西对于Web Proxy就好像是jdk对于Java一样(当然也许有其他的工具可以先访问代理服务器,这里不讨论),下载完成后可以解压就可以使用了,就像使用jdk一样首先在命令行窗口中找到该文件所在文件夹,如果不想每次都输入一串目录来查找的话也可以将这个文件的路径添加至环境变量(至于如何配置自行搜索)。
当Web Proxy和Wget都准备好之后就可以开始运行了:
首先运行Web Proxy程序,然后通过Wget请求使用代理并且发送Request
(Wget命令:wget xxx.xxx.xx -e use_proxy=on -e http_proxy=127.0.0.1:8000),其中“xxx.xxx.xx”就是你要请求的网址

3. Web Proxy源码
import socket def handleReq(clientSocket):
# recv data
# find the fileName
# judge if the file named "fileName" if existed
# if not exists, send req to get it recvData = clientSocket.recv(1024).decode()
fileName = recvData.split()[1].split("//")[1].replace('/', '')
print("fileName: " + fileName)
try:
file = open(fileName, 'rb')
print("File is found in proxy server.")
responseMsg = file.readlines()
for i in range(0, len(responseMsg)):
clientSocket.sendall(responseMsg[i])
print("Send, done.")
except Exception:
try:
print("File is not exist.\nSend request to server...")
proxyClientSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serverName = fileName.split(":")[0]
proxyClientSocket.connect((serverName, 80))
proxyClientSocket.sendall(recvData.encode())
responseMsg = proxyClientSocket.recv(4069)
print("File is found in server.")
proxyClientSocket.sendall(responseMsg)
print("Send, done.")
# cache
cache = open("./" + fileName, 'w')
cache.writelines(responseMsg.decode().replace('\r\n', '\n'))
cache.close()
print("Cache, done.")
except:
print("Connect timeout.") def startProxy(port):
proxyServerSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
proxyServerSocket.bind(("", port))
proxyServerSocket.listen(0)
while True:
try:
print("Proxy is waiting for connecting...")
clientSocket, addr = proxyServerSocket.accept()
print("Connect established")
handleReq(clientSocket)
clientSocket.close()
except Exception as e:
print("error: {0}".format(e))
break
proxyServerSocket.close() if __name__ == '__main__':
while True:
try:
port = int(input("choose a port number over 1024:"))
except ValueError:
print("Please input an integer rather than {0}".format(type(port)))
continue
else:
if port <= 1024:
print("Please input an integer greater than 1024")
continue
else:
break
startProxy(port)
4. Wget工具包
链接:https://pan.baidu.com/s/1Ae2_Cq9SYbKnfhhyJ1VhpQ
提取码:awsl
Python3网络学习案例四:编写Web Proxy的更多相关文章
- Python3网络学习案例三:编写web server
1. 写在前面 这里总结的并不够详细,有时间了再进行补充. 2. 设计思路 HTTP协议是建立在TCP上的1. 建立服务器端TCP套接字(绑定ip,port),等待监听连接:listen(2. 打开浏 ...
- Python3网络学习案例一:Ping详解
1. 使用Ping做什么 ping用于确定本地主机是否能与另一台主机成功交换(发送与接收)数据包,再根据返回的信息,就可以推断TCP/IP参数是否设置正确,以及运行是否正常.网络是否通畅等. 2. 效 ...
- Python3网络学习案例二:traceroute详解
1. 写在前面 本文是基于上一篇"ping详解"写的: 不同操作系统下的命令也不同,本文仅针对windows系统,命令为"tracert xxx",效果如下 2 ...
- python3.4学习笔记(四) 3.x和2.x的区别,持续更新
python3.4学习笔记(四) 3.x和2.x的区别 在2.x中:print html,3.x中必须改成:print(html) import urllib2ImportError: No modu ...
- Beego学习笔记四:编写Model
MVC实践一:编写模型 1> 打开mysql数据库,设计表的结构 <1>登录mysql数据库,如下 <2>这三个标注的参数皆有用,需要谨记. <3>创 ...
- python3语法学习第四天--字符串
字符串:是python中的常用数据类型 Python 不支持单字符类型,单字符在 Python 中也是作为一个字符串使用 访问字符串的值: 下标和分片截取 字符串的连接:‘+’ 字符串内置函数挺多,选 ...
- python3语法学习第四天--序列
序列是Python中最基本的数据结构. 序列中的每个元素都分配一个索引从0开始依此类推. Python有6个序列的内置类型,但最常见的是列表和元组. 序列可以的操作:索引,切片,加,乘,检查成员. 此 ...
- python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例
python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例 新浪爱彩双色球开奖数据URL:http://zst.aicai.com/ssq/openInfo/ 最终输出结果格 ...
- 从零开始学习PYTHON3讲义(十四)写一个mp3播放器
<从零开始PYTHON3>第十四讲 通常来说,Python解释执行,运行速度慢,并不适合完整的开发游戏.随着电脑速度的快速提高,这种情况有所好转,但开发游戏仍然不是Python的重点工作. ...
随机推荐
- Linux知识点笔记
Linux启动脚本 rcS文件,rcS文件位于系统根目录下的"/etc/init.d"下. rcS文件本质是一个bash shell脚本,因此遵循bash脚本的语法规则. [1] ...
- P4915 帕秋莉的魔导书(动态开点线段树)
题目背景 帕秋莉有一个巨大的图书馆,里面有数以万计的书,其中大部分为魔导书. 题目描述 魔导书是一种需要钥匙才能看得懂的书,然而只有和书写者同等或更高熟练度的人才能看得见钥匙.因此,每本魔导书都有它自 ...
- MySQL中事务和事务的隔离级别
本文主要是帮助理解相关知识,没有具体的操作和代码. 事务 事务就是一组操作,这组操作要么全部成功,要么全部失败. 最经典的例子就是银行转账: 张三给李四转账100,对用户来说,就是一个操作.但对应到数 ...
- 一文看懂YOLO v3
论文地址:https://pjreddie.com/media/files/papers/YOLOv3.pdf论文:YOLOv3: An Incremental Improvement YOLO系列的 ...
- Python 导入模块的两种方法:import xxx 和from...import xxx
import 方式导入模块 import tool.getsum.add # 导入模块,优先会从启动文件的当前目录开始寻找 # 如果找到,就使用 # 如果找不到,会在系统模块存放目录去 tool.ge ...
- Linux桌面环境配置
目录 更换软件源 中文输入法 firefox安装flash插件 编译安装Vim 关闭蓝牙开机自启 yakuake无法正常使用 在中文环境下将默认目录修改成英文 电脑换成了thinkpad x1c 20 ...
- 3.Android网络编程-http介绍
1.HTTP请求方法 根据HTTP标准,HTTP请求可以使用多种请求方法. HTTP1.0定义了三种请求方法: GET(查), POST(改)和 HEAD(获取报头,一般用来测试链接是否正常)方法. ...
- centos7搭建docker环境
Docker简介 Docker是一种虚拟化技术,用来将你的应用程序及其依赖的环境一起打包成一个镜像发布,使得在任何地方都能获得相同的运行环境. Docker 是一个开源项目,诞生于 2013 年初,最 ...
- vm虚拟机设置共享文件夹不显示
1. 确认VMtools已经装好,开启共享文件夹,设置好共享目录 2.执行命令 sudo mount -t vmhgfs .host:/ /mnt/hgfs如果出现错误: Error: cannot ...
- linux(centos8):lnmp环境编译安装zabbix5.0
一,zabbix的用途: zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案 zabbix能监视各种网络参数,保证服务器系统的安全运营: 并提供灵活的通知机制以 ...