50行Python代码实现代理服务器,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

评论关闭