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转换摩斯密码示例
Feb 16 Python
Python的Flask框架的简介和安装方法
Nov 13 Python
浅谈Python中的可变对象和不可变对象
Jul 07 Python
Python对列表中的各项进行关联详解
Aug 15 Python
Python判断中文字符串是否相等的实例
Jul 06 Python
python读取并定位excel数据坐标系详解
Jun 26 Python
Python实现数值积分方式
Nov 20 Python
浅析Django中关于session的使用
Dec 30 Python
pytorch使用 to 进行类型转换方式
Jan 08 Python
Django 解决由save方法引发的错误
May 21 Python
浅谈keras中的Merge层(实现层的相加、相减、相乘实例)
May 23 Python
Pyqt5将多个类组合在一个界面显示的完整示例
Sep 04 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
优化使用mysql存储session的php代码
2008/01/10 PHP
php数组中删除元素的实现代码
2012/06/22 PHP
php上传文件问题汇总
2015/01/30 PHP
php获取今日开始时间和结束时间的方法
2017/02/27 PHP
PHP的重载使用魔术方法代码实例详解
2021/02/26 PHP
取选中的radio的值
2010/01/11 Javascript
JavaScript中string转换成number介绍
2014/12/31 Javascript
不用一句js代码初始化组件
2016/01/27 Javascript
基于JQuery的$.ajax方法进行异步请求导致页面闪烁的解决办法
2016/05/10 Javascript
jQuery+PHP实现微信转盘抽奖功能的方法
2016/05/25 Javascript
通俗解释JavaScript正则表达式快速记忆
2017/08/23 Javascript
详解vue-cli中模拟数据的两种方法
2018/07/03 Javascript
layui动态渲染生成左侧3级菜单的方法(根据后台返回数据)
2019/09/23 Javascript
[05:53]完美世界携手游戏风云打造 卡尔工作室观战系统篇
2013/04/22 DOTA
深入理解Python中range和xrange的区别
2017/11/26 Python
python实现二叉树的遍历
2017/12/11 Python
浅谈Django中的数据库模型类-models.py(一对一的关系)
2018/05/30 Python
Python高级特性与几种函数的讲解
2019/03/08 Python
元组列表字典(莫烦python基础)
2019/04/03 Python
python3 pillow模块实现简单验证码
2019/10/31 Python
python实现把两个二维array叠加成三维array示例
2019/11/29 Python
使用OpenCV-python3实现滑动条更新图像的Canny边缘检测功能
2019/12/12 Python
浅谈keras 模型用于预测时的注意事项
2020/06/27 Python
HTML5中的nav标签学习笔记
2016/06/24 HTML / CSS
GOOD AMERICAN官网:为曲线性感而设计
2017/12/28 全球购物
支票、地址标签、包装纸和慰问卡:Current Catalog
2018/01/30 全球购物
什么是典型的软件三层结构?软件设计为什么要分层?软件分层有什么好处?
2012/03/14 面试题
自动化专业毕业生自荐信
2013/11/01 职场文书
市场营销专业个人求职信范文
2013/12/14 职场文书
民主生活会发言材料
2014/10/20 职场文书
2019假期福利管理制度!
2019/07/15 职场文书
python爬虫--selenium模块
2021/03/31 Python
一篇文章了解正则表达式的替换技巧
2022/02/24 Javascript
原生JS实现分页
2022/04/19 Javascript
Redis基本数据类型List常用操作命令
2022/06/01 Redis
html5+实现plus.io进行拍照和图片等获取
2022/06/01 HTML / CSS