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 相关文章推荐
videocapture库制作python视频高速传输程序
Dec 23 Python
对于Python中线程问题的简单讲解
Apr 03 Python
浅析Python中return和finally共同挖的坑
Aug 18 Python
详解python和matlab的优势与区别
Jun 28 Python
Python中typing模块与类型注解的使用方法
Aug 05 Python
使用Python实现分别输出每个数组
Dec 06 Python
Python实现非正太分布的异常值检测方式
Dec 09 Python
python爬虫模拟浏览器访问-User-Agent过程解析
Dec 28 Python
使用Python打造一款间谍程序的流程分析
Feb 21 Python
使用jupyter notebook直接打开.md格式的文件
Apr 10 Python
Biblibili视频投稿接口分析并以Python实现自动投稿功能
Feb 05 Python
宝塔更新Python及Flask项目的部署
Apr 11 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 ajax 分页类代码
2008/11/13 PHP
在PHP中检查PHP文件是否有语法错误的方法
2009/12/23 PHP
phpexcel导入excel数据使用方法实例
2013/12/24 PHP
php集成套件服务器xampp安装使用教程(适合第一次玩PHP的新手)
2015/06/03 PHP
PHP将URL转换成短网址的算法分享
2016/09/13 PHP
php根据用户名和手机号查询是否存在手机号码
2017/02/16 PHP
浅谈PHP发送HTTP请求的几种方式
2017/07/25 PHP
php利用云片网实现短信验证码功能的示例代码
2017/11/18 PHP
php通过header发送自定义数据方法
2018/01/18 PHP
使用laravel的migrate创建数据表的方法
2019/09/30 PHP
用jscript实现新建word文档
2007/06/15 Javascript
JS实现静止元素自动移动示例
2014/04/14 Javascript
jQuery搜索子元素的方法
2015/02/10 Javascript
javascript每日必学之封装
2016/02/23 Javascript
模仿password输入框的实现代码
2016/06/07 Javascript
微信小程序 绘图之饼图实现
2016/10/24 Javascript
基于js中document.cookie全面解析
2017/09/14 Javascript
使用Vue-Router 2实现路由功能实例详解
2017/11/14 Javascript
详解Vue源码之数据的代理访问
2018/12/11 Javascript
vue+webpack dev本地调试全局样式引用失效的解决方案
2019/11/12 Javascript
微信小程序学习总结(二)样式、属性、模板操作分析
2020/06/04 Javascript
H5+css3+js搭建带验证码的登录页面
2020/10/11 Javascript
Python 多进程和数据传递的理解
2017/10/09 Python
浅谈python配置与使用OpenCV踩的一些坑
2018/04/02 Python
python+os根据文件名自动生成文本
2019/03/21 Python
Python 保持登录状态进行接口测试的方法示例
2019/08/06 Python
python实现低通滤波器代码
2020/02/26 Python
python 双循环遍历list 变量判断代码
2020/05/04 Python
Python-openpyxl表格读取写入的案例详解
2020/11/02 Python
HTML5标签与HTML4标签的区别示例介绍
2013/07/18 HTML / CSS
会计自我鉴定范文
2013/10/06 职场文书
临床医学系毕业生推荐信
2013/11/09 职场文书
岗位职责的定义
2013/11/10 职场文书
学校评语大全
2014/05/06 职场文书
pyqt5打包成exe可执行文件的方法
2021/05/14 Python
python调用ffmpeg命令行工具便捷操作视频示例实现过程
2021/11/01 Python