Python實(shí)現(xiàn)網(wǎng)絡(luò)端口轉(zhuǎn)發(fā)和重定向的方法
本文實(shí)例講述了Python實(shí)現(xiàn)網(wǎng)絡(luò)端口轉(zhuǎn)發(fā)和重定向的方法。分享給大家供大家參考,具體如下:
【任務(wù)】
需要將某個(gè)網(wǎng)絡(luò)端口轉(zhuǎn)發(fā)到另一個(gè)主機(jī)(forwarding),但可能會(huì)是不同的端口(redirecting)。
【解決方案】
兩個(gè)使用threading和socket模塊的類就能完成我們需要的端口轉(zhuǎn)發(fā)和重定向。
#encoding=utf8 #author: walker摘自《Python Cookbook(2rd)》 #date: 2015-06-11 #function: 網(wǎng)絡(luò)端口的轉(zhuǎn)發(fā)和重定向(適用于python2/python3) import sys, socket, time, threading LOGGING = True loglock = threading.Lock() #打印日志到標(biāo)準(zhǔn)輸出 def log(s, *a): if LOGGING: loglock.acquire() try: print('%s:%s' % (time.ctime(), (s % a))) sys.stdout.flush() finally: loglock.release() class PipeThread(threading.Thread): pipes = [] #靜態(tài)成員變量,存儲(chǔ)通訊的線程編號(hào) pipeslock = threading.Lock() def __init__(self, source, sink): #Thread.__init__(self) #python2.2之前版本適用 super(PipeThread, self).__init__() self.source = source self.sink = sink log('Creating new pipe thread %s (%s -> %s)', self, source.getpeername(), sink.getpeername()) self.pipeslock.acquire() try: self.pipes.append(self) finally: self.pipeslock.release() self.pipeslock.acquire() try: pipes_now = len(self.pipes) finally: self.pipeslock.release() log('%s pipes now active', pipes_now) def run(self): while True: try: data = self.source.recv(1024) if not data: break self.sink.send(data) except: break log('%s terminating', self) self.pipeslock.acquire() try: self.pipes.remove(self) finally: self.pipeslock.release() self.pipeslock.acquire() try: pipes_left = len(self.pipes) finally: self.pipeslock.release() log('%s pipes still active', pipes_left) class Pinhole(threading.Thread): def __init__(self, port, newhost, newport): #Thread.__init__(self) #python2.2之前版本適用 super(Pinhole, self).__init__() log('Redirecting: localhost: %s->%s:%s', port, newhost, newport) self.newhost = newhost self.newport = newport self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.sock.bind(('', port)) self.sock.listen(5) #參數(shù)為timeout,單位為秒 def run(self): while True: newsock, address = self.sock.accept() log('Creating new session for %s:%s', *address) fwd = socket.socket(socket.AF_INET, socket.SOCK_STREAM) fwd.connect((self.newhost, self.newport)) PipeThread(newsock, fwd).start() #正向傳送 PipeThread(fwd, newsock).start() #逆向傳送 if __name__ == '__main__': print('Starting Pinhole port fowarder/redirector') try: port = int(sys.argv[1]) newhost = sys.argv[2] try: newport = int(sys.argv[3]) except IndexError: newport = port except (ValueError, IndexError): print('Usage: %s port newhost [newport]' % sys.argv[0]) sys.exit(1) #sys.stdout = open('pinhole.log', 'w') #將日志寫入文件 Pinhole(port, newhost, newport).start()
【討論】
當(dāng)你在管理一個(gè)網(wǎng)絡(luò)時(shí),即使是一個(gè)很小的網(wǎng)絡(luò),端口轉(zhuǎn)發(fā)和重定向的功能有時(shí)也能給你很大的幫助。一些不在你的控制之下的應(yīng)用或者服務(wù)可能是以硬連接的方式接入到某個(gè)特定的服務(wù)器的地址或端口。通過(guò)插入轉(zhuǎn)發(fā)和重定向,你就能將對(duì)應(yīng)用的連接請(qǐng)求發(fā)送到其他更合適的主機(jī)或端口上。
更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python URL操作技巧總結(jié)》、《Python Socket編程技巧總結(jié)》、《Python圖片操作技巧總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python入門與進(jìn)階經(jīng)典教程》及《Python文件與目錄操作技巧匯總》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
相關(guān)文章
python中以函數(shù)作為參數(shù)(回調(diào)函數(shù))的實(shí)現(xiàn)方法
這篇文章主要介紹了python中以函數(shù)作為參數(shù)(回調(diào)函數(shù))的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01Python利用pymupdf實(shí)現(xiàn)簡(jiǎn)單的PDF閱讀器
這篇文章主要為大家詳細(xì)介紹了Python如何利用pymupdf實(shí)現(xiàn)簡(jiǎn)單的PDF閱讀器,并展示了PDF文件的內(nèi)容,文中的示例代碼講解詳細(xì),需要的可以了解一下2023-08-08numpy實(shí)現(xiàn)合并多維矩陣、list的擴(kuò)展方法
今天小編就為大家分享一篇numpy實(shí)現(xiàn)合并多維矩陣、list的擴(kuò)展方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05對(duì)于Python的框架中一些會(huì)話程序的管理
這篇文章主要介紹了對(duì)于Python的框架中一些會(huì)話程序的管理,會(huì)話的實(shí)現(xiàn)是Python框架的基本功能,本文主要講述了對(duì)其的一些管理維護(hù)要點(diǎn),需要的朋友可以參考下2015-04-04利用scikitlearn畫(huà)ROC曲線實(shí)例
這篇文章主要介紹了利用scikitlearn畫(huà)ROC曲線實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-07-07關(guān)于Python函數(shù)的定義和參數(shù)
這篇文章主要介紹了關(guān)于Python函數(shù)的定義和參數(shù),Python中的函數(shù)我們可以理解成是一種具有功能的包裝塊,也就是封裝具有某一種功能的代碼塊,需要的朋友可以參考下2023-04-04