Python实现简单的代理服务器


Posted in Python onJuly 25, 2015

本文实例讲述了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程序设计有所帮助。

Python 相关文章推荐
Python实现身份证号码解析
Sep 01 Python
windows下ipython的安装与使用详解
Oct 20 Python
简单了解python模块概念
Jan 11 Python
使用Anaconda3建立虚拟独立的python2.7环境方法
Jun 11 Python
PyQt5重写QComboBox的鼠标点击事件方法
Jun 25 Python
利用python list完成最简单的DB连接池方法
Aug 09 Python
Python中Unittest框架的具体使用
Aug 27 Python
Python 实现向word(docx)中输出
Feb 13 Python
基于python 凸包问题的解决
Apr 16 Python
解决Pytorch自定义层出现多Variable共享内存错误问题
Jun 28 Python
keras 两种训练模型方式详解fit和fit_generator(节省内存)
Jul 03 Python
K近邻法(KNN)相关知识总结以及如何用python实现
Jan 28 Python
Python实现截屏的函数
Jul 25 #Python
Python基于PycURL自动处理cookie的方法
Jul 25 #Python
Python基于PycURL实现POST的方法
Jul 25 #Python
Python实现对excel文件列表值进行统计的方法
Jul 25 #Python
Python自动扫雷实现方法
Jul 25 #Python
Python导出DBF文件到Excel的方法
Jul 25 #Python
Python实现的RSS阅读器实例
Jul 25 #Python
You might like
ajax实现无刷新分页(php)
2010/07/18 PHP
PHP连接MongoDB示例代码
2012/09/06 PHP
两千行代码的PHP学习笔记汇总
2014/10/05 PHP
详解PHP实现支付宝小程序用户授权的工具类
2018/12/25 PHP
基于JQuery的Pager分页器实现代码
2010/07/17 Javascript
非常棒的10款jQuery 幻灯片插件
2011/06/14 Javascript
jQuery层次选择器选择元素使用介绍
2013/04/18 Javascript
基于jquery实现省市联动效果
2015/11/23 Javascript
深入理解JS addLoadEvent函数
2016/05/20 Javascript
jquery mobile 实现自定义confirm确认框效果的简单实例
2016/06/17 Javascript
jQuery实现区域打印功能代码详解
2016/06/17 Javascript
vue.js实例todoList项目
2017/07/07 Javascript
微信小程序项目实践之验证码倒计时功能
2018/07/18 Javascript
JS面向对象之多选框实现
2020/01/17 Javascript
vue中组件通信详解(父子组件, 爷孙组件, 兄弟组件)
2020/07/27 Javascript
Vue 样式切换及三元判断样式关联操作
2020/08/09 Javascript
[01:11:10]2014 DOTA2华西杯精英邀请赛 5 24 iG VS VG加赛
2014/05/26 DOTA
[09:43]DOTA2每周TOP10 精彩击杀集锦vol.5
2014/06/25 DOTA
Python字符串处理函数简明总结
2015/04/13 Python
Python从MP3文件获取id3的方法
2015/06/15 Python
Python学习小技巧之列表项的推导式与过滤操作
2017/05/20 Python
Python判断一个三位数是否为水仙花数的示例
2018/11/13 Python
Python参数解析模块sys、getopt、argparse使用与对比分析
2019/04/02 Python
python使用for...else跳出双层嵌套循环的方法实例
2020/05/17 Python
在keras里实现自定义上采样层
2020/06/28 Python
python安装sklearn模块的方法详解
2020/11/28 Python
Notino瑞典:购买香水和美容产品
2019/07/26 全球购物
应届生.NET方向面试题
2015/05/23 面试题
出口公司经理求职简历中的自我评价
2013/10/13 职场文书
学校食堂采购员岗位职责
2013/12/05 职场文书
法学专业毕业生自荐信范文
2013/12/18 职场文书
高中自我鉴定
2013/12/20 职场文书
2014年技术部工作总结
2014/12/12 职场文书
二手车转让协议书
2015/01/29 职场文书
工程移交协议书
2016/03/24 职场文书
JAVA API 实用类 String详解
2021/10/05 Java/Android