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实现获取命令行输出结果的方法
Jun 10 Python
Python机器学习之scikit-learn库中KNN算法的封装与使用方法
Dec 14 Python
查看python安装路径及pip安装的包列表及路径
Apr 03 Python
浅谈Python大神都是这样处理XML文件的
May 31 Python
Python简单处理坐标排序问题示例
Jul 11 Python
使用Fabric自动化部署Django项目的实现
Sep 27 Python
python实现回旋矩阵方式(旋转矩阵)
Dec 04 Python
python sorted函数原理解析及练习
Feb 10 Python
Django 再谈一谈json序列化
Mar 16 Python
python两种注释用法的示例
Oct 09 Python
opencv-python图像配准(匹配和叠加)的实现
Jun 23 Python
python 安全地删除列表元素的方法
Mar 16 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
php数组函数序列之ksort()对数组的元素键名进行升序排序,保持索引关系
2011/11/02 PHP
php4与php5的区别小结(配置异同)
2011/12/20 PHP
国产PHP开发框架myqee新手快速入门教程
2014/07/14 PHP
PHP生成zip压缩包的常用方法示例
2019/08/22 PHP
jQuery Flash/MP3/Video多媒体插件
2010/01/18 Javascript
jQuery Jcrop插件实现图片选取功能
2011/11/23 Javascript
网页中表单按回车就自动提交的问题的解决方案
2014/11/03 Javascript
浅谈js 闭包引起的内存泄露问题
2015/06/22 Javascript
jquery实现漫天雪花飞舞的圣诞祝福雪花效果代码分享
2015/08/20 Javascript
jquery实现删除一个元素后面的所有元素功能
2015/12/21 Javascript
Postman模拟发送带token的请求方法
2018/03/31 Javascript
Vue组件中的data必须是一个function的原因浅析
2018/09/03 Javascript
JavaScript的Proxy可以做哪些有意思的事儿
2019/06/15 Javascript
express框架中使用jwt实现验证的方法
2019/08/25 Javascript
jsonp格式前端发送和后台接受写法的代码详解
2019/11/07 Javascript
15分钟上手vue3.0(小结)
2020/05/20 Javascript
vue动态合并单元格并添加小计合计功能示例
2020/11/26 Vue.js
[01:25:33]完美世界DOTA2联赛PWL S3 INK ICE vs Magma 第二场 12.20
2020/12/23 DOTA
python通过floor函数舍弃小数位的方法
2015/03/17 Python
Python的math模块中的常用数学函数整理
2016/02/04 Python
python3+dlib实现人脸识别和情绪分析
2018/04/21 Python
python通过伪装头部数据抵抗反爬虫的实例
2018/05/07 Python
python实现傅里叶级数展开的实现
2018/07/21 Python
Python基础之条件控制操作示例【if语句】
2019/03/23 Python
关于Pytorch的MLP模块实现方式
2020/01/07 Python
Python爬虫入门有哪些基础知识点
2020/06/02 Python
英国顶级水晶珠宝零售商之一:Tresor Paris
2019/04/27 全球购物
Auguste The Label官网:澳大利亚一家精品女装时尚品牌
2020/06/14 全球购物
一道SQL面试题
2012/12/31 面试题
计算机专业个人求职自荐信
2013/09/21 职场文书
会计学应届毕业生推荐信
2013/11/04 职场文书
个人求职信范文分享
2013/12/13 职场文书
高中军训感言1000字
2014/03/01 职场文书
高中生评语大全
2014/04/25 职场文书
党的群众路线教育实践活动整改方案
2014/10/28 职场文书
浅谈Python数学建模之线性规划
2021/06/23 Python