Python簡單實現(xiàn)的代理服務器端口映射功能示例
本文實例講述了Python簡單實現(xiàn)的代理服務器端口映射功能。分享給大家供大家參考,具體如下:
一 代碼
1、模擬服務端代碼
import sys
import socket
import threading
#回復消息,原樣返回
def replyMessage(conn):
while True:
data = conn.recv(1024)
conn.send(data)
if data.decode().lower() == 'bye':
break
conn.close()
def main():
sockScr = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sockScr.bind(('', port))
sockScr.listen(200)
while True:
try:
conn, addr = sockScr.accept()
#只允許特定主機訪問本服務器
if addr[0] != onlyYou:
conn.close()
continue
#創(chuàng)建并啟動線程
t = threading.Thread(target=replyMessage, args=(conn,))
t.start()
except:
print('error')
if __name__ == '__main__':
try:
#獲取命令行參數(shù)
port = int(sys.argv[1])
onlyYou = sys.argv[2]
main()
except:
print('Must give me a number as port')
2、模擬代理服務器代碼
import sys
import socket
import threading
def middle(conn, addr):
#面向服務器的Socket
sockDst = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sockDst.connect((ipServer,portServer))
while True:
data = conn.recv(1024).decode()
print('收到客戶端消息:'+data)
if data == '不要發(fā)給服務器':
conn.send('該消息已被代理服務器過濾'.encode())
print('該消息已過濾')
elif data.lower() == 'bye':
print(str(addr)+'客戶端關閉連接')
break
else:
sockDst.send(data.encode())
print('已轉發(fā)服務器')
data_fromServer = sockDst.recv(1024).decode()
print('收到服務器回復的消息:'+data_fromServer)
if data_fromServer == '不要發(fā)給客戶端':
conn.send('該消息已被代理服務器修改'.encode())
print('消息已被篡改')
else:
conn.send(b'Server reply:'+data_fromServer.encode())
print('已轉發(fā)服務器消息給客戶端')
conn.close()
sockDst.close()
def main():
sockScr = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sockScr.bind(('', portScr))
sockScr.listen(200)
print('代理已啟動')
while True:
try:
conn, addr = sockScr.accept()
t = threading.Thread(target=middle, args=(conn, addr))
t.start()
print('新客戶:'+str(addr))
except:
pass
if __name__ == '__main__':
try:
#(本機IP地址,portScr)<==>(ipServer,portServer)
#代理服務器監(jiān)聽端口
portScr = int(sys.argv[1])
#服務器IP地址與端口號
ipServer = sys.argv[2]
portServer = int(sys.argv[3])
main()
except:
print('Sth error')
3、模擬客戶端代碼
import sys
import socket
def main():
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((ip, port))
while True:
data = input('What do you want to ask:')
sock.send(data.encode())
print(sock.recv(1024).decode())
if data.lower() == 'bye':
break
sock.close()
if __name__ == '__main__':
try:
#代理服務器的IP地址和端口號
ip = sys.argv[1]
port = int(sys.argv[2])
main()
except:
print('Sth error')
二 運行結果

三 運行說明
從結果可以看出,代理服務器代碼能夠?qū)蛻舳撕头掌髦g的內(nèi)容進行記錄,也能夠修改雙方通信內(nèi)容,這樣實際存在潛在危險。只要代理服務想這樣做,客戶在網(wǎng)絡上的通信就沒有什么隱私可言了,因此如果涉及金錢交易,最好不要使用代理服務器。
更多關于Python相關內(nèi)容感興趣的讀者可查看本站專題:《Python Socket編程技巧總結》、《Python URL操作技巧總結》、《Python數(shù)據(jù)結構與算法教程》、《Python函數(shù)使用技巧總結》、《Python字符串操作技巧匯總》及《Python入門與進階經(jīng)典教程》
希望本文所述對大家Python程序設計有所幫助。
相關文章
Python+OpenCV實現(xiàn)尋找到圓點標定板的角點
這篇文章主要為大家詳細介紹了Python+OpenCV實現(xiàn)找到圓點標定板所有點后通過距離找兩個角點,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下2022-11-11
python 使用matplotlib 實現(xiàn)從文件中讀取x,y坐標的可視化方法
今天小編就為大家分享一篇python 使用matplotlib 實現(xiàn)從文件中讀取x,y坐標的可視化方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07
Python使用Chrome插件實現(xiàn)爬蟲過程圖解
這篇文章主要介紹了Python使用Chrome插件實現(xiàn)爬蟲,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-06-06
Python基于pywinauto實現(xiàn)的自動化采集任務
這篇文章主要介紹了Python基于pywinauto實現(xiàn)的自動化采集任務,模擬了輸入單詞, 復制例句, 獲取例句, 清空剪切板, 然后重復這個操作,需要的朋友可以參考下2023-04-04

