当前位置:网站首页>Python3網路學習案例四:編寫Web Proxy
Python3網路學習案例四:編寫Web Proxy
2020-11-06 01:17:00 【itread01】
代理伺服器的定義和作用請走百度百科~
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
&n
版权声明
本文为[itread01]所创,转载请带上原文链接,感谢
https://www.itread01.com/content/1604502065.html
边栏推荐
- C language 100 question set 004 - statistics of the number of people of all ages
- 7.3.1 file upload and zero XML registration interceptor
- Sort the array in ascending order according to the frequency
- 写一个通用的幂等组件,我觉得很有必要
- nlp模型-bert从入门到精通(一)
- keras model.compile损失函数与优化器
- 【QT】 QThread部分原始碼淺析
- 6.8 multipartresolver file upload parser (in-depth analysis of SSM and project practice)
- 【效能優化】納尼?記憶體又溢位了?!是時候總結一波了!!
- 直播预告 | 微服务架构学习系列直播第三期
猜你喜欢

python 保存list数据

连肝三个通宵,JVM77道高频面试题详细分析,就这?

Pattern matching: The gestalt approach一种序列的文本相似度方法

Technical director, to just graduated programmers a word - do a good job in small things, can achieve great things

Basic principle and application of iptables

向北京集结!OpenI/O 2020启智开发者大会进入倒计时

自然语言处理之分词、命名主体识别、词性、语法分析-stanfordcorenlp-NER(二)

链表的常见算法总结

嘘!异步事件这样用真的好么?

快快使用ModelArts,零基础小白也能玩转AI!
随机推荐
Azure Data Factory(三)整合 Azure Devops 實現CI/CD
Microservices: how to solve the problem of link tracing
python过滤敏感词记录
连肝三个通宵,JVM77道高频面试题详细分析,就这?
一时技痒,撸了个动态线程池,源码放Github了
mongodb(从0到1),11天mongodb初级到中级进阶秘籍
微服務 - 如何解決鏈路追蹤問題
文本去重的技术方案讨论(一)
6.7 theme resolver theme style parser (in-depth analysis of SSM and project practice)
5.5 ControllerAdvice注解 -《SSM深入解析与项目实战》
解決pl/sql developer中資料庫插入資料亂碼問題
[译] 5个Vuex插件,给你的下个VueJS项目
hadoop 命令总结
写一个通用的幂等组件,我觉得很有必要
如何使用ES6中的参数
mac 下常用快捷键,mac启动ftp
Basic principle and application of iptables
前端模組化簡單總結
接口压力测试:Siege压测安装、使用和说明
Chainlink将美国选举结果带入区块链 - Everipedia