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 动态获取当前运行的类名和函数名的方法
Apr 15 Python
基于Python实现的百度贴吧网络爬虫实例
Apr 17 Python
Python ValueError: invalid literal for int() with base 10 实用解决方法
Jun 21 Python
详解 Python中LEGB和闭包及装饰器
Aug 03 Python
Tensorflow 训练自己的数据集将数据直接导入到内存
Jun 19 Python
python 实现查找文件并输出满足某一条件的数据项方法
Jun 12 Python
解决Djang2.0.1中的reverse导入失败的问题
Aug 16 Python
Python 实现文件读写、坐标寻址、查找替换功能
Sep 11 Python
基于python cut和qcut的用法及区别详解
Nov 22 Python
Python中的wordcloud库安装问题及解决方法
May 27 Python
详解python UDP 编程
Aug 24 Python
Python包管理工具pip的15 个使用小技巧
May 17 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实现无限级分类实现代码(递归方法)
2011/01/01 PHP
php 使用GD库为页面增加水印示例代码
2014/03/24 PHP
非常好用的Zend Framework分页类
2014/06/25 PHP
PHP中使用curl入门教程
2015/07/02 PHP
基于jquery实现的可以编辑选择的下拉框的代码
2010/11/19 Javascript
js对象之JS入门之Array对象操作小结
2011/01/09 Javascript
js 中{},[]中括号,大括号使用详解
2011/05/12 Javascript
javascript陷阱 一不小心你就中招了(字符运算)
2013/11/10 Javascript
jquery选择checked在ie8普通模式下的问题
2014/02/12 Javascript
jquery对table中各数据的增加、保存、删除操作示例
2014/05/14 Javascript
网页运行时提示对象不支持abigimage属性或方法
2014/08/10 Javascript
两种方法基于jQuery实现IE浏览器兼容placeholder效果
2014/10/14 Javascript
学JavaScript七大注意事项【必看】
2016/05/04 Javascript
JavaScript必看小技巧(必看)
2016/06/07 Javascript
angular实现form验证实例代码
2017/01/17 Javascript
iview table高度动态设置方法
2018/03/14 Javascript
Nodejs文件上传、监听上传进度的代码
2020/03/27 NodeJs
[01:32]2014DOTA2西雅图邀请赛 CIS我们有信心进入正赛
2014/07/08 DOTA
python基础教程之类class定义使用方法
2014/02/20 Python
python中virtualenvwrapper安装与使用
2018/05/20 Python
PyTorch线性回归和逻辑回归实战示例
2018/05/22 Python
python八皇后问题的解决方法
2018/09/27 Python
python实现桌面壁纸切换功能
2019/01/21 Python
在Python 的线程中运行协程的方法
2020/02/24 Python
python爬虫容易学吗
2020/06/02 Python
解析python 中/ 和 % 和 //(地板除)
2020/06/28 Python
CSS3 毛玻璃效果
2019/08/14 HTML / CSS
HTML5自定义data-* data(obj)属性和jquery的data()方法的使用
2012/12/13 HTML / CSS
Nordgreen美国官网:在线购买极简主义斯堪的纳维亚手表
2019/07/24 全球购物
幼儿园中秋节活动方案
2014/02/06 职场文书
青春寄语大全
2014/04/09 职场文书
求职自我推荐信
2014/06/25 职场文书
年度考核表个人总结
2015/03/06 职场文书
2016关于预防职务犯罪的心得体会
2016/01/21 职场文书
深入浅出讲解Java8函数式编程
2022/01/18 Java/Android
使用python求解迷宫问题的三种实现方法
2022/03/17 Python