45fan.com - 路饭网

搜索: 您的位置主页 > 网络频道 > 阅读资讯:Python如何实现代理服务器?

Python如何实现代理服务器?

2015-08-11 13:16:46 来源:www.45fan.com 【

Python如何实现代理服务器?

本文实例讲述了Python实现简单的代理服务器。分享给大家供大家参考。具体如下:

具备简单的管理功能,运行后 telnet localhost 9000 端口可以进行管理主要功能就是做包转发,如果有一个桥服务器,可以用来外网访问内网用,还是很管用的

#/bin/env python 
#coding:utf-8 
import socket,select,sys,time 
import thread 
s_list = [] 
def loop(cs,addr,s_ip,s_port): 
 print '%s %d connected.' % addr 
 ts = socket.socket() 
 try: 
 ts.connect((s_ip,s_port)) 
 except: 
 cs.close() 
 print '%s %d closed.' % addr 
 sys.exit(0) 
 while True: 
 rl,wl,xl = select.select([cs.fileno(),ts.fileno()],[],[cs.fileno(),ts.fileno()]) 
 if len(xl) > 0: 
  cs.close() 
  ts.close() 
  print '%s %d closed.' % addr 
  sys.exit(0) 
 if len(rl) > 0: 
  if rl[0] == cs.fileno(): 
  rs = ts 
  ws = cs 
  else: 
  rs = cs 
  ws = ts 
  try: 
  buffer = ws.recv(10000) 
  if len(buffer) == 0: 
   raise 
  rs.send(buffer) 
  except: 
  rs.close() 
  ts.close() 
  print '%s %d closed.' % addr 
  sys.exit(0) 
def mainserver(l_port,s_ip,s_port): 
 global s_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) 
 while True: 
 cs,addr = ss.accept() 
 thread.start_new_thread(loop,(cs,addr,s_ip,s_port)) 
def manager(l_port): 
 global start,s_list 
 ss = socket.socket() 
 ss.bind(('0.0.0.0',l_port)) 
 ss.listen(10) 
 while True: 
 cs,addr = ss.accept() 
 cs.send("""trans server 1.0\r\ntype 'help' to get help\r\n""")
 buffer = '' 
 while True: 
  buf = cs.recv(10000) 
  if len(buf) == 0: 
  cs.close() 
  break 
  if buf[-1] not in ('\r','\n'): 
  buffer += buf 
  continue 
  buffer += buf 
  cmd = buffer.strip() 
  buffer = '' 
  if cmd == 'exit': 
  cs.close() 
  break 
  elif cmd == 'stop': 
  start = 0 
  cs.close() 
  sys.exit(0) 
  elif cmd == 'list': 
  b = '' 
  for l in s_list: 
   b += '%4d %s:%d\r\n' % l 
  if len(b) > 0: 
   cs.send(b) 
  elif cmd in ('help','?'): 
  cs.send("""-------------------------------------------\r
exit\r 
 exit telnet\r 
start localport serverip:serverport\r 
 start a new server\r 
list\r 
 list all server\r 
-------------------------------------------\r 
""") 
  else: 
  cmds = cmd.split(" ",1) 
  if len(cmds) > 1 and cmds[0] == 'start': 
   args = cmds[1].strip().split(" ",1) 
   if len(args) != 2: 
   cs.send('start localport serverip:serverport\r\n') 
   continue 
   arg = args[1].split(":",1) 
   if len(arg) != 2: 
   cs.send('start localport serverip:serverport\r\n') 
   continue 
   try: 
   l_port = int(args[0]) 
   s_ip = arg[0] 
   s_port = int(arg[1]) 
   except: 
   cs.send('start localport serverip:serverport\r\n') 
   continue 
   thread.start_new_thread(mainserver,(l_port,s_ip,s_port)) 
   cs.send('start OK!\r\n') 
  else: 
   cs.send('no command [%s]\r\n' % cmd) 
   continue 
def main(): 
 global start 
 if len(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,)) 
 while start: 
 time.sleep(1) 
if __name__ == '__main__': 
 start = 0 
 main()

希望本文所述对大家的Python程序设计有所帮助。


本文地址:http://www.45fan.com/a/question/17416.html
Tags: 实现 python 简单
编辑:路饭网
关于我们 | 联系我们 | 友情链接 | 网站地图 | Sitemap | App | 返回顶部