50行Python代码实现代理服务器详解编程语言

这里的代理服务器,是指二级代理服务器。比如:A可以访问B,B可以访问C,A不能直接访问C。这时,如果在B开一个二级代理,就可实现A访问C。现有的工具有CCProxy。

这里就是使用Python简单的实现一个二级代理。

#coding=utf-8    
import socket    
import select    
import sys    
import threading   
import time   
import logging   
import os   
logsDir = "logs"   
if not os.path.isdir(logsDir):   
    os.mkdir(logsDir)   
       
logging.basicConfig(level=logging.DEBUG,   
                format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',   
                datefmt='%a, %d %b %Y %H:%M:%S',   
                filename='logs/logs.log',   
                filemode='a')   
    
#C的IP和端口    
to_addr = ('0.0.0.0', 8087)   
   
class Proxy:    
    def __init__(self, addr):    
        self.proxy = socket.socket(socket.AF_INET, socket.SOCK_STREAM)    
        self.proxy.bind(addr)    
        self.proxy.listen(10)    
        self.inputs = [self.proxy]    
        self.route = {}    
      
    def serve_forever(self):    
        logging.info('proxy listen...')   
        while 1:    
            readable, _, _ = select.select(self.inputs, [], [])    
            for self.sock in readable:    
                if self.sock == self.proxy:    
                    self.on_join()    
                else:   
                    try:   
                        data = self.sock.recv(8192)   
                    except Exception, e:   
                        logging.error(str(e))   
                        self.on_quit()   
                        continue   
                       
                    if not data:    
                        self.on_quit()    
                    else:   
                        try:   
                            self.route[self.sock].send(data)   
                        except Exception, e:   
                            logging.error(str(e))   
                            self.on_quit()   
                            continue   
      
    def on_join(self):    
        client, addr = self.proxy.accept()    
        logging.info("proxy client " + str(addr) + 'connect')   
        forward = socket.socket(socket.AF_INET, socket.SOCK_STREAM)    
        forward.connect(to_addr)    
        self.inputs += [client, forward]    
        self.route[client] = forward    
        self.route[forward] = client    
       
    #删除连接   
    def on_quit(self):   
        ls = [self.sock]   
        if self.sock in self.route:   
            ls.append(self.route[self.sock])   
        for s in ls:   
            if s in self.inputs:   
                self.inputs.remove(s)   
            if s in self.route:   
                del self.route[s]    
            s.close()    
               
if __name__ == "__main__":   
    try:    
        Proxy(('', 8192)).serve_forever()   
    except KeyboardInterrupt:    
        logging.error("KeyboardInterrupt")   
        return   
  

来自:http://blog.csdn.net/junfeng_feng/article/details/42966363

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/8481.html

(0)
上一篇 2021年7月18日 19:44
下一篇 2021年7月18日 19:44

相关推荐

发表回复

登录后才能评论