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对小数进行除法运算的正确方法示例
Aug 25 Python
Python描述器descriptor详解
Feb 03 Python
Python字符串替换实例分析
May 11 Python
python编程实现希尔排序
Apr 13 Python
Django实现表单验证
Sep 08 Python
python3 实现对图片进行局部切割的方法
Dec 05 Python
Python编程深度学习绘图库之matplotlib
Dec 28 Python
Python面向对象之类的定义与继承用法示例
Jan 14 Python
python实现贪吃蛇小游戏
Mar 21 Python
Pandas实现DataFrame按行求百分数(比例数)
Dec 27 Python
Python实现AI换脸功能
Apr 10 Python
基于python 凸包问题的解决
Apr 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
IIS7.X配置PHP运行环境小结
2011/06/09 PHP
PHPMailer邮件发送的实现代码
2013/05/04 PHP
PHP使用CURL实现多线程抓取网页
2015/04/30 PHP
PHP使用第三方即时获取物流动态实例详解
2017/04/27 PHP
PHP实现的简单AES加密解密算法实例
2017/05/29 PHP
javascript onkeydown,onkeyup,onkeypress,onclick,ondblclick
2009/02/04 Javascript
Jquery 快速构建可拖曳的购物车DragDrop
2009/11/30 Javascript
javascript showModalDialog模态对话框使用说明
2009/12/31 Javascript
JavaScript支持的最大递归调用次数分析
2014/06/24 Javascript
JS 作用域与作用域链详解
2015/04/07 Javascript
CSS图片响应式 垂直水平居中
2015/08/14 Javascript
简单学习JavaScript中的for语句循环结构
2015/11/10 Javascript
javascript数组去重小结
2016/03/07 Javascript
基于JS如何实现类似QQ好友头像hover时显示资料卡的效果(推荐)
2016/06/09 Javascript
jQuery中的AjaxSubmit使用讲解
2016/09/25 Javascript
JQuery PHP图片在线裁剪实例
2020/07/27 Javascript
jQuery实现删除li节点的方法
2016/12/06 Javascript
bootstrap输入框组件使用方法详解
2017/01/19 Javascript
手把手教你搭建ES6的开发运行环境
2017/07/11 Javascript
vue中appear的用法
2017/08/17 Javascript
JS实现的ajax和同源策略(实例讲解)
2017/12/01 Javascript
vue项目中openlayers绘制行政区划
2020/12/24 Vue.js
Python命名空间详解
2014/08/18 Python
python实现文本去重且不打乱原本顺序
2016/01/26 Python
python如何获取当前文件夹下所有文件名详解
2019/01/25 Python
pymysql模块的使用(增删改查)详解
2019/09/09 Python
使用html2canvas实现浏览器截图的示例代码
2018/01/26 HTML / CSS
美国精品家居用品网站:US-Mattress
2016/08/24 全球购物
高二物理教学反思
2014/02/08 职场文书
校园标语大全
2014/06/19 职场文书
电气工程及其自动化专业毕业生自荐信
2014/06/21 职场文书
慰问信格式
2015/02/14 职场文书
母亲节寄语大全
2015/02/27 职场文书
《我和小伙伴》教学反思
2016/02/20 职场文书
2016年119消防宣传日活动总结
2016/04/05 职场文书
php引用传递
2021/04/01 PHP