一个python写的简单的代理服务器

from: http://dream-people.iteye.com/blog/364402

下面是我用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()  

你可能感兴趣的:(thread,python,socket,Blog)