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 set集合类型操作总结
Nov 07 Python
利用Python脚本生成sitemap.xml的实现方法
Jan 31 Python
Python处理文本文件中控制字符的方法
Feb 07 Python
python3实现抓取网页资源的 N 种方法
May 02 Python
浅谈Django学习migrate和makemigrations的差别
Jan 18 Python
Python之pymysql的使用小结
Jul 01 Python
将Python文件打包成.EXE可执行文件的方法
Aug 11 Python
pytorch自定义初始化权重的方法
Aug 17 Python
python并发爬虫实用工具tomorrow实用解析
Sep 25 Python
Python之变量类型和if判断方式
May 05 Python
django序列化时使用外键的真实值操作
Jul 15 Python
python 爬虫请求模块requests详解
Dec 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
php中用加号与用array_merge合并数组的区别深入分析
2013/06/03 PHP
解析阿里云ubuntu12.04环境下配置Apache+PHP+PHPmyadmin+MYsql
2013/06/26 PHP
CodeIgniter配置之routes.php用法实例分析
2016/01/19 PHP
PHP递归遍历多维数组实现无限分类的方法
2016/05/06 PHP
jquery插件之easing 动态菜单
2010/08/21 Javascript
按钮JS复制文本框和表格的代码
2011/04/01 Javascript
javascript学习笔记(二十) 获得和设置元素的特性(属性)
2012/06/20 Javascript
JS中showModalDialog 的使用解析
2013/04/17 Javascript
Javascript中的getUTCHours()方法使用详解
2015/06/10 Javascript
使用JavaScript实现ajax的实例代码
2016/05/11 Javascript
妙用Bootstrap的 popover插件实现校验表单提示功能
2016/08/29 Javascript
js倒计时显示实例
2016/12/11 Javascript
原生js实现验证码功能
2017/03/16 Javascript
socket.io与pm2(cluster)集群搭配的解决方案
2017/06/02 Javascript
基于js原生和ajax的get和post方法以及jsonp的原生写法实例
2017/10/16 Javascript
详解基于Vue+Koa的pm2配置
2017/10/24 Javascript
AngularJS 将再发布一个重要版本 然后进入长期支持阶段
2018/01/31 Javascript
AngularJS模态框模板ngDialog的使用详解
2018/05/11 Javascript
vue+koa2实现session、token登陆状态验证的示例
2019/08/30 Javascript
webpack 如何解析代码模块路径的实现
2019/09/04 Javascript
JavaScript 装逼指南(js另类写法)
2020/05/10 Javascript
[10:34]DOTA2上海特级锦标赛全纪录
2016/03/25 DOTA
Python编程之微信推送模板消息功能示例
2017/08/21 Python
python 接口测试response返回数据对比的方法
2018/02/11 Python
一文了解Python并发编程的工程实现方法
2019/05/31 Python
python3.4+pycharm 环境安装及使用方法
2019/06/13 Python
在windows下使用python进行串口通讯的方法
2019/07/02 Python
Pandas数据离散化原理及实例解析
2019/11/16 Python
CSS3实现任意图片lowpoly动画效果实例
2017/05/11 HTML / CSS
贝佳斯官方网站:Borghese
2020/05/08 全球购物
双方协议书
2014/04/22 职场文书
新教师岗前培训方案
2014/06/05 职场文书
入伍志愿书怎么写?
2019/07/19 职场文书
导游词之烟台威海蓬莱
2019/11/14 职场文书
vue前端工程的搭建
2021/03/31 Vue.js
Windows Server 2016 配置 IIS 的详细步骤
2022/04/28 Servers