当前位置:网站首页>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
边栏推荐
- Basic principle and application of iptables
- 接口压力测试:Siege压测安装、使用和说明
- 【Flutter 實戰】pubspec.yaml 配置檔案詳解
- Jmeter——ForEach Controller&Loop Controller
- python 下载模块加速实现记录
- 神经网络简史
- 7.2.2 compressing static resources through gzipresourceresolver
- Top 10 best big data analysis tools in 2020
- 连肝三个通宵,JVM77道高频面试题详细分析,就这?
- Elasticsearch database | elasticsearch-7.5.0 application construction
猜你喜欢
随机推荐
03_ Detailed explanation and test of installation and configuration of Ubuntu Samba
Why do private enterprises do party building? ——Special subject study of geek state holding Party branch
一时技痒,撸了个动态线程池,源码放Github了
Introduction to Google software testing
Chainlink将美国选举结果带入区块链 - Everipedia
After brushing leetcode's linked list topic, I found a secret!
Electron应用使用electron-builder配合electron-updater实现自动更新
hadoop 命令总结
DevOps是什么
词嵌入教程
Gradient understanding decline
7.2.1 cache configuration of static resources
keras model.compile损失函数与优化器
Azure Data Factory(三)整合 Azure Devops 實現CI/CD
技術總監,送給剛畢業的程式設計師們一句話——做好小事,才能成就大事
【C/C++ 2】Clion配置与运行C语言
6.9.2 session flashmapmanager redirection management
微服務 - 如何解決鏈路追蹤問題
从零学习人工智能,开启职业规划之路!
哇,ElasticSearch多字段权重排序居然可以这么玩







