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中封装GObject模块进行图形化程序编程的教程
Apr 14 Python
使用python实现省市三级菜单效果
Jan 20 Python
Python开发的实用计算器完整实例
May 10 Python
快速了解Python开发中的cookie及简单代码示例
Jan 17 Python
Python扩展内置类型详解
Mar 26 Python
Python面向对象类继承和组合实例分析
May 28 Python
Django中数据库的数据关系:一对一,一对多,多对多
Oct 21 Python
pycharm编写spark程序,导入pyspark包的3中实现方法
Aug 02 Python
python matplotlib如何给图中的点加标签
Nov 14 Python
Python新建项目自动添加介绍和utf-8编码的方法
Dec 26 Python
Python爬虫入门教程01之爬取豆瓣Top电影
Jan 24 Python
Python 的 f-string 可以连接字符串与数字的原因解析
Feb 20 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的curl实现get,post和cookie(实例介绍)
2013/06/17 PHP
本地计算机无法启动Apache故障处理
2014/08/08 PHP
php中的常用魔术方法汇总
2016/02/14 PHP
JavaScript语法着色引擎(demo及打包文件下载)
2007/06/13 Javascript
通过修改referer下载文件的方法
2008/05/11 Javascript
理解Javascript_03_javascript全局观
2010/10/11 Javascript
JavaScript 模拟类机制及私有变量的方法及思路
2013/07/10 Javascript
jQuery监控文本框事件并作相应处理的方法
2015/04/16 Javascript
跟我学习javascript的基本类型和引用类型
2015/11/16 Javascript
Javascript 调用 ActionScript 的简单方法
2016/09/22 Javascript
JS搜狐面试题分析
2016/12/16 Javascript
详解vue数据渲染出现闪烁问题
2017/06/29 Javascript
浅谈Angular2 ng-content 指令在组件中嵌入内容
2017/08/18 Javascript
对angularJs中2种自定义服务的实例讲解
2018/09/30 Javascript
React中阻止事件冒泡的问题详析
2019/04/12 Javascript
解析vue、angular深度作用选择器
2019/09/11 Javascript
JS实现瀑布流效果
2020/03/07 Javascript
[00:48]DOTA2国际邀请赛公开赛报名开始 扫码开启逐梦之旅
2018/06/06 DOTA
python实现自动登录人人网并访问最近来访者实例
2014/09/26 Python
详解Python中的__new__、__init__、__call__三个特殊方法
2016/06/02 Python
Python中强大的命令行库click入门教程
2016/12/26 Python
python django 增删改查操作 数据库Mysql
2017/07/27 Python
Python变量赋值的秘密分享
2018/04/03 Python
Python3.5多进程原理与用法实例分析
2019/04/05 Python
Pandas_cum累积计算和rolling滚动计算的用法详解
2019/07/04 Python
python3.7 openpyxl 在excel单元格中写入数据实例
2020/09/01 Python
HTML5实现获取地理位置信息并定位功能
2015/04/25 HTML / CSS
HTML5移动端手机网站开发流程
2016/04/25 HTML / CSS
HTML5实现桌面通知 提示功能
2017/10/11 HTML / CSS
波比布朗英国官网:Bobbi Brown英国
2017/11/13 全球购物
合作协议书怎么写
2014/04/18 职场文书
歌颂祖国演讲稿
2014/05/04 职场文书
2014年办公室人员工作总结
2014/12/09 职场文书
2015年党建工作目标责任书
2015/05/08 职场文书
公司财务管理制度
2015/08/04 职场文书
同学聚会开幕词
2019/04/02 职场文书