간단한 프록시 서버 구현을 위한 Python

4381 단어
이 문서의 실례는 파이썬이 간단한 프록시 서버를 실현하는 것을 설명한다.여러분에게 참고할 수 있도록 나누어 드리겠습니다.구체적으로 다음과 같습니다.
간단한 관리 기능을 갖추고 운행 후telnetlocalhost9000 포트에서 관리할 수 있는 주요 기능은 패키지 전송이다. 만약에 브리지 서버가 있다면 외부 네트워크에서 내부 네트워크에 접근할 수 있지만 그래도 매우 유용하다

#/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
type 'help' to get help\r
""") buffer = '' while True: buf = cs.recv(10000) if len(buf) == 0: cs.close() break if buf[-1] not in ('\r','
'): 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
' % 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
') continue arg = args[1].split(":",1) if len(arg) != 2: cs.send('start localport serverip:serverport\r
') continue try: l_port = int(args[0]) s_ip = arg[0] s_port = int(arg[1]) except: cs.send('start localport serverip:serverport\r
') continue thread.start_new_thread(mainserver,(l_port,s_ip,s_port)) cs.send('start OK!\r
') else: cs.send('no command [%s]\r
' % 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 프로그램 설계에 도움이 되기를 바랍니다.

좋은 웹페이지 즐겨찾기