本文实例讲述了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