Python实现简单的代理服务器
本文实例讲述了Python实现简单的代理服务器。分享给大家供大家参考。具体如下:
具备简单的管理功能,运行后telnetlocalhost9000端口可以进行管理主要功能就是做包转发,如果有一个桥服务器,可以用来外网访问内网用,还是很管用的
#/bin/envpython
#coding:utf-8
importsocket,select,sys,time
importthread
s_list=[]
defloop(cs,addr,s_ip,s_port):
print'%s%dconnected.'%addr
ts=socket.socket()
try:
ts.connect((s_ip,s_port))
except:
cs.close()
print'%s%dclosed.'%addr
sys.exit(0)
whileTrue:
rl,wl,xl=select.select([cs.fileno(),ts.fileno()],[],[cs.fileno(),ts.fileno()])
iflen(xl)>0:
cs.close()
ts.close()
print'%s%dclosed.'%addr
sys.exit(0)
iflen(rl)>0:
ifrl[0]==cs.fileno():
rs=ts
ws=cs
else:
rs=cs
ws=ts
try:
buffer=ws.recv(10000)
iflen(buffer)==0:
raise
rs.send(buffer)
except:
rs.close()
ts.close()
print'%s%dclosed.'%addr
sys.exit(0)
defmainserver(l_port,s_ip,s_port):
globals_list
try:
ss=socket.socket()
ss.bind(('0.0.0.0',l_port))
ss.listen(10)
s_list.append((l_port,s_ip,s_port))
except:
sys.exit(0)
whileTrue:
cs,addr=ss.accept()
thread.start_new_thread(loop,(cs,addr,s_ip,s_port))
defmanager(l_port):
globalstart,s_list
ss=socket.socket()
ss.bind(('0.0.0.0',l_port))
ss.listen(10)
whileTrue:
cs,addr=ss.accept()
cs.send("""transserver1.0\r\ntype'help'togethelp\r\n""")
buffer=''
whileTrue:
buf=cs.recv(10000)
iflen(buf)==0:
cs.close()
break
ifbuf[-1]notin('\r','\n'):
buffer+=buf
continue
buffer+=buf
cmd=buffer.strip()
buffer=''
ifcmd=='exit':
cs.close()
break
elifcmd=='stop':
start=0
cs.close()
sys.exit(0)
elifcmd=='list':
b=''
forlins_list:
b+='%4d%s:%d\r\n'%l
iflen(b)>0:
cs.send(b)
elifcmdin('help','?'):
cs.send("""-------------------------------------------\r
exit\r
exittelnet\r
startlocalportserverip:serverport\r
startanewserver\r
list\r
listallserver\r
-------------------------------------------\r
""")
else:
cmds=cmd.split("",1)
iflen(cmds)>1andcmds[0]=='start':
args=cmds[1].strip().split("",1)
iflen(args)!=2:
cs.send('startlocalportserverip:serverport\r\n')
continue
arg=args[1].split(":",1)
iflen(arg)!=2:
cs.send('startlocalportserverip:serverport\r\n')
continue
try:
l_port=int(args[0])
s_ip=arg[0]
s_port=int(arg[1])
except:
cs.send('startlocalportserverip:serverport\r\n')
continue
thread.start_new_thread(mainserver,(l_port,s_ip,s_port))
cs.send('startOK!\r\n')
else:
cs.send('nocommand[%s]\r\n'%cmd)
continue
defmain():
globalstart
iflen(sys.argv)==3:
try:
l_port=int(sys.argv[1])
s_ip,s_port=sys.argv[2].split(":")
s_port=int(s_port)
thread.start_new_thread(mainserver,(l_port,s_ip,s_port))
except:
pass
start=1
thread.start_new_thread(manager,(9000,))
whilestart:
time.sleep(1)
if__name__=='__main__':
start=0
main()
希望本文所述对大家的Python程序设计有所帮助。