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程序设计有所帮助。