本文实例讲述了Python简单实现的代理服务器端口映射功能。分享给大家供大家参考,具体如下:
一 代码
1、模拟服务端代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
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 #创建并启动线程 t = threading.Thread(target = replyMessage, args = (conn,)) t.start() except : print ( 'error' ) if __name__ = = '__main__' : try : #获取命令行参数 port = int (sys.argv[ 1 ]) onlyYou = sys.argv[ 2 ] main() except : print ( 'Must give me a number as port' ) |
2、模拟代理服务器代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
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 = = '不要发给服务器' : conn.send( '该消息已被代理服务器过滤' .encode()) print ( '该消息已过滤' ) elif data.lower() = = 'bye' : print ( str (addr) + '客户端关闭连接' ) break else : sockDst.send(data.encode()) print ( '已转发服务器' ) data_fromServer = sockDst.recv( 1024 ).decode() print ( '收到服务器回复的消息:' + data_fromServer) if data_fromServer = = '不要发给客户端' : conn.send( '该消息已被代理服务器修改' .encode()) print ( '消息已被篡改' ) else : conn.send(b 'Server reply:' + data_fromServer.encode()) print ( '已转发服务器消息给客户端' ) 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) #代理服务器监听端口 portScr = int (sys.argv[ 1 ]) #服务器IP地址与端口号 ipServer = sys.argv[ 2 ] portServer = int (sys.argv[ 3 ]) main() except : print ( 'Sth error' ) |
3、模拟客户端代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
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' ) |
二 运行结果
三 运行说明
从结果可以看出,代理服务器代码能够对客户端和服务器之间的内容进行记录,也能够修改双方通信内容,这样实际存在潜在危险。只要代理服务想这样做,客户在网络上的通信就没有什么隐私可言了,因此如果涉及金钱交易,最好不要使用代理服务器。
希望本文所述对大家Python程序设计有所帮助。
原文链接:https://blog.csdn.net/chengqiuming/article/details/78601163