僅用50行Python代碼實(shí)現(xiàn)一個(gè)簡(jiǎn)單的代理服務(wù)器
之前遇到一個(gè)場(chǎng)景是這樣的:
我在自己的電腦上需要用mongodb圖形客戶端,但是mongodb的服務(wù)器地址沒有對(duì)外網(wǎng)開放,只能通過(guò)先登錄主機(jī)A,然后再?gòu)腁連接mongodb服務(wù)器B。
本來(lái)想通過(guò)ssh端口轉(zhuǎn)發(fā)的,但是我沒有從機(jī)器A連接ssh到B的權(quán)限。于是就自己用python寫一個(gè)。
原理很簡(jiǎn)單。
1.開一個(gè)socket server監(jiān)聽連接請(qǐng)求
2.每接受一個(gè)客戶端的連接請(qǐng)求,就往要轉(zhuǎn)發(fā)的地址建一條連接請(qǐng)求。即client->proxy->forward。proxy既是socket服務(wù)端(監(jiān)聽client),也是socket客戶端(往forward請(qǐng)求)。
3.把client->proxy和proxy->forward這2條socket用字典給綁定起來(lái)。
4.通過(guò)這個(gè)映射的字典把send/recv到的數(shù)據(jù)原封不動(dòng)的傳遞
下面上代碼。
#coding=utf-8
import socket
import select
import sys
to_addr = ('xxx.xxx.xx.xxx', 10000)#轉(zhuǎn)發(fā)的地址
class Proxy:
def __init__(self, addr):
self.proxy = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
self.proxy.bind(addr)
self.proxy.listen(10)
self.inputs = [self.proxy]
self.route = {}
def serve_forever(self):
print 'proxy listen...'
while 1:
readable, _, _ = select.select(self.inputs, [], [])
for self.sock in readable:
if self.sock == self.proxy:
self.on_join()
else:
data = self.sock.recv(8096)
if not data:
self.on_quit()
else:
self.route[self.sock].send(data)
def on_join(self):
client, addr = self.proxy.accept()
print addr,'connect'
forward = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
forward.connect(to_addr)
self.inputs += [client, forward]
self.route[client] = forward
self.route[forward] = client
def on_quit(self):
for s in self.sock, self.route[self.sock]:
self.inputs.remove(s)
del self.route[s]
s.close()
if __name__ == '__main__':
try:
Proxy(('',12345)).serve_forever()#代理服務(wù)器監(jiān)聽的地址
except KeyboardInterrupt:
sys.exit(1)
- Python寫的Socks5協(xié)議代理服務(wù)器
- python實(shí)現(xiàn)簡(jiǎn)單的TCP代理服務(wù)器
- Python實(shí)現(xiàn)簡(jiǎn)單的代理服務(wù)器
- Python實(shí)現(xiàn)TCP協(xié)議下的端口映射功能的腳本程序示例
- Python實(shí)現(xiàn)的FTP通信客戶端與服務(wù)器端功能示例
- python快速建立超簡(jiǎn)單的web服務(wù)器的實(shí)現(xiàn)方法
- Python搭建FTP服務(wù)器的方法示例
- 嘗試用最短的Python代碼來(lái)實(shí)現(xiàn)服務(wù)器和代理服務(wù)器
- python實(shí)現(xiàn)通過(guò)代理服務(wù)器訪問遠(yuǎn)程url的方法
- Python簡(jiǎn)單實(shí)現(xiàn)的代理服務(wù)器端口映射功能示例
相關(guān)文章
requests在python中發(fā)送請(qǐng)求的實(shí)例講解
在本篇文章里小編給大家整理的是一篇關(guān)于requests在python中發(fā)送請(qǐng)求的實(shí)例講解內(nèi)容,有興趣的朋友們可以測(cè)試學(xué)習(xí)下。2021-02-02
python中response.text 和response.content的區(qū)別詳解
這篇文章主要介紹了python中response.text 和response.content的區(qū)別詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05
python opencv實(shí)現(xiàn)圖片缺陷檢測(cè)(講解直方圖以及相關(guān)系數(shù)對(duì)比法)
這篇文章主要介紹了python opencv 圖片缺陷檢測(cè),主要講解直方圖以及相關(guān)系數(shù)對(duì)比法,本文通過(guò)實(shí)例截圖給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04
Python列表轉(zhuǎn)一維DataFrame的完整指南
在數(shù)據(jù)處理領(lǐng)域,Pandas的DataFrame是當(dāng)之無(wú)愧的王者,本文將用5個(gè)核心方法,教你優(yōu)雅地將一維列表轉(zhuǎn)換為Pandas DataFrame,感興趣的可以了解下2025-04-04

