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') #將日志寫(xiě)入文件
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入門(mén)與進(jìn)階經(jīng)典教程》及《Python文件與目錄操作技巧匯總》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
相關(guān)文章
Python實(shí)現(xiàn)鏈表反轉(zhuǎn)與合并操作詳解
這篇文章主要為大家詳細(xì)介紹了?Python?中反轉(zhuǎn)鏈表和合并鏈表的應(yīng)用場(chǎng)景及實(shí)現(xiàn)方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下2025-02-02
為python爬蟲(chóng)docker鏡像添加nodejs環(huán)境實(shí)現(xiàn)方法
這篇文章主要為大家介紹了為python爬蟲(chóng)docker鏡像添加nodejs環(huán)境實(shí)現(xiàn)方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
pygame實(shí)現(xiàn)井字棋之第一步繪制九宮格
這篇文章主要介紹了pygame實(shí)現(xiàn)井字棋之第一步繪制九宮格,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-05-05
Python將多個(gè)list合并為1個(gè)list的方法
今天小編就為大家分享一篇Python將多個(gè)list合并為1個(gè)list的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06
python3使用smtplib實(shí)現(xiàn)發(fā)送郵件功能
這篇文章主要為大家詳細(xì)介紹了python3使用smtplib實(shí)現(xiàn)發(fā)送郵件功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05
Python使用PyGreSQL操作PostgreSQL數(shù)據(jù)庫(kù)教程
這篇文章主要介紹了Python使用PyGreSQL操作PostgreSQL數(shù)據(jù)庫(kù),需要的朋友可以參考下2014-07-07

