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 18 Python
Python中dictionary items()系列函数的用法实例
Aug 21 Python
在Python的Flask框架下收发电子邮件的教程
Apr 21 Python
Python实现的根据文件名查找数据文件功能示例
May 02 Python
django admin 后台实现三级联动的示例代码
Jun 22 Python
python opencv实现运动检测
Jul 10 Python
OpenCV图像颜色反转算法详解
May 13 Python
python 判断文件还是文件夹的简单实例
Jun 10 Python
如何通过python画loss曲线的方法
Jun 26 Python
Django中提供的6种缓存方式详解
Aug 05 Python
使用python 将图片复制到系统剪贴中
Dec 13 Python
python 制作python包,封装成可用模块教程
Jul 13 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
大师制作的中短波矿石收音机
2020/04/02 无线电
简单的php 验证图片生成函数
2009/05/21 PHP
php调用mysql存储过程实例分析
2014/12/29 PHP
phpcms的分类名称和类别名称的调用
2017/01/05 PHP
Laravel 微信小程序后端实现用户登录的示例代码
2019/11/26 PHP
Jquery多选下拉列表插件jquery multiselect功能介绍及使用
2013/05/24 Javascript
原生JS实现加入收藏夹的代码
2013/10/24 Javascript
JS实现仿百度输入框自动匹配功能的示例代码
2014/02/19 Javascript
JQuery获取与设置HTML元素的内容或文本的实现代码
2014/06/20 Javascript
简介JavaScript中Boolean.toSource()方法的使用
2015/06/05 Javascript
举例详解Python中smtplib模块处理电子邮件的使用
2015/06/24 Javascript
javascript中数组和字符串的方法对比
2016/07/20 Javascript
vue组件挂载到全局方法的示例代码
2018/08/02 Javascript
CKEditor扩展插件:自动排版功能autoformat插件实现方法详解
2020/02/06 Javascript
Flask SQLAlchemy一对一,一对多的使用方法实践
2013/02/10 Python
Python实现简单网页图片抓取完整代码实例
2017/12/15 Python
解决Python中pandas读取*.csv文件出现编码问题
2019/07/12 Python
python实现的登录与提交表单数据功能示例
2019/09/25 Python
Python读取csv文件实例解析
2019/12/30 Python
2020最新pycharm汉化安装(python工程狮亲测有效)
2020/04/26 Python
安装pyinstaller遇到的各种问题(小结)
2020/11/20 Python
使用CSS3编写灰阶滤镜来制作黑白照片效果的方法
2016/05/09 HTML / CSS
基于Modernizr 让网站进行优雅降级的分析
2013/04/21 HTML / CSS
德国圣伯纳德草药屋:Kräuterhaus Sanct Bernhard(有中文站)
2018/08/05 全球购物
计算机网络专业个人的自我评价
2013/10/17 职场文书
高一自我鉴定
2013/12/17 职场文书
三好学生个人先进事迹材料
2014/05/17 职场文书
国企干部对照检查材料
2014/08/22 职场文书
质量在我心中演讲稿
2014/09/02 职场文书
七一建党节演讲稿
2014/09/11 职场文书
乡村教师党员四风问题对照检查材料思想汇报
2014/10/08 职场文书
2014年自愿离婚协议书
2014/10/10 职场文书
企业培训简报范文
2015/07/20 职场文书
运动会跳远广播稿
2015/08/19 职场文书
python数据库批量插入数据的实现(executemany的使用)
2021/04/30 Python
Golang表示枚举类型的详细讲解
2021/09/04 Golang