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中list列表的高级函数
May 17 Python
ansible作为python模块库使用的方法实例
Jan 17 Python
使用Python对Access读写操作
Mar 30 Python
Python中扩展包的安装方法详解
Jun 14 Python
python将字典内容存入mysql实例代码
Jan 18 Python
python在线编译器的简单原理及简单实现代码
Feb 02 Python
详解python中各种文件打开模式
Jan 19 Python
Windows下Pycharm远程连接虚拟机中Centos下的Python环境(图文教程详解)
Mar 19 Python
python数据处理——对pandas进行数据变频或插值实例
Apr 22 Python
Django 设置admin后台表和App(应用)为中文名的操作方法
May 10 Python
Python如何绘制日历图和热力图
Aug 07 Python
Python中读取文件名中的数字的实例详解
Dec 25 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生成便于打印的网页
2006/10/09 PHP
PHP生成静态页面详解
2006/12/05 PHP
如何解决phpmyadmin导入数据库文件最大限制2048KB
2015/10/09 PHP
Laravel利用gulp如何构建前端资源详解
2018/06/03 PHP
PHP笛卡尔积实现原理及代码实例
2020/12/09 PHP
一款JavaScript压缩工具:X2JSCompactor
2007/06/13 Javascript
url地址自动加#号问题说明
2010/08/21 Javascript
基于jquery的监控数据是否发生改变
2011/04/11 Javascript
文本框根据输入内容自适应高度的代码
2011/10/24 Javascript
JavaScript四种调用模式和this示例介绍
2014/01/02 Javascript
在Node.js中实现文件复制的方法和实例
2014/06/05 Javascript
jQuery选择器源码解读(二):select方法
2015/03/31 Javascript
jQuery实现气球弹出框式的侧边导航菜单效果
2015/09/22 Javascript
基于bootstrap实现bootstrap中文网巨幕效果
2017/05/02 Javascript
webpack学习--webpack经典7分钟入门教程
2017/06/28 Javascript
Vue中如何实现轮播图的示例代码
2017/07/27 Javascript
详解使用React制作一个模态框
2019/03/14 Javascript
微信小程序wx.request拦截器使用详解
2019/07/09 Javascript
layer.open提交子页面的form和layedit文本编辑内容的方法
2019/09/27 Javascript
JS中箭头函数与this的写法和理解
2021/01/14 Javascript
[00:34]DOTA2上海特级锦标赛 VG战队宣传片
2016/03/04 DOTA
python数据结构之图的实现方法
2015/07/08 Python
python3.5使用tkinter制作记事本
2016/06/20 Python
python实现二维码扫码自动登录淘宝
2016/12/27 Python
python实现n个数中选出m个数的方法
2018/11/13 Python
python for循环输入一个矩阵的实例
2018/11/14 Python
使用Python的SymPy库解决数学运算问题的方法
2019/03/27 Python
python pandas 时间日期的处理实现
2019/07/30 Python
Python使用import导入本地脚本及导入模块的技巧总结
2019/08/07 Python
关于torch.optim的灵活使用详解(包括重写SGD,加上L1正则)
2020/02/20 Python
Python selenium抓取虎牙短视频代码实例
2020/03/02 Python
HTML5实现晶莹剔透的雨滴特效
2014/05/14 HTML / CSS
如何打造一封优秀的留学推荐信
2014/01/25 职场文书
社区服务理念口号
2015/12/25 职场文书
小学音乐课教学反思
2016/02/18 职场文书
《进击的巨人》新联动CM 兵长强势出击兽巨人
2022/04/05 日漫