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程序员鲜为人知但你应该知道的17个问题
Jun 04 Python
在Python中使用poplib模块收取邮件的教程
Apr 29 Python
python开发之list操作实例分析
Feb 22 Python
Python列表和元组的定义与使用操作示例
Jul 26 Python
python3连接MySQL数据库实例详解
May 24 Python
使用Python写一个量化股票提醒系统
Aug 22 Python
python使用folium库绘制地图点击框
Sep 21 Python
Python编程学习之如何判断3个数的大小
Aug 07 Python
Django 项目通过加载不同env文件来区分不同环境
Feb 17 Python
关于keras.layers.Conv1D的kernel_size参数使用介绍
May 22 Python
python实现取余操作的简单实例
Aug 16 Python
python之语音识别speech模块
Sep 09 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
将RTF格式的文件转成HTML并在网页中显示的代码
2006/10/09 PHP
PHP用星号隐藏部份用户名、身份证、IP、手机号等实例
2014/04/08 PHP
Yii快速入门经典教程
2015/12/28 PHP
PHP中$GLOBALS['HTTP_RAW_POST_DATA']和$_POST的区别分析
2017/07/03 PHP
Mac系统下安装PHP Xdebug
2018/03/30 PHP
Laravel5.1 框架Middleware中间件基本用法实例分析
2020/01/04 PHP
基于jquery的用鼠标画出可移动的div
2012/09/06 Javascript
JQuery的Ajax跨域请求原理概述及实例
2013/04/26 Javascript
jQuery遍历Table应用示例
2014/04/09 Javascript
Jquery响应回车键直接提交表单操作代码
2014/07/25 Javascript
JavaScript设置获取和设置属性的方法
2015/03/04 Javascript
JavaScript使用push方法添加一个元素到数组末尾用法实例
2015/04/06 Javascript
javascript实现五星评分功能
2015/11/10 Javascript
Vue.js学习笔记之 helloworld
2016/08/14 Javascript
轻松实现jquery选项卡切换效果
2016/10/10 Javascript
jQuery实现联动下拉列表查询框
2017/01/04 Javascript
JavaScript表单验证完美代码
2017/03/02 Javascript
如何使用angularJs
2017/05/08 Javascript
JsChart组件使用详解
2018/03/04 Javascript
jQuery实现图片上传预览效果功能完整实例【测试可用】
2018/05/28 jQuery
解决vue接口数据赋值给data没有反应的问题
2018/08/27 Javascript
JavaScript Reflect Metadata实现详解
2019/12/12 Javascript
vuex管理状态仓库使用详解
2020/07/29 Javascript
[46:47]2014 DOTA2国际邀请赛中国区预选赛 DT VS HGT
2014/05/22 DOTA
python控制台显示时钟的示例
2014/02/24 Python
Python实现在某个数组中查找一个值的算法示例
2018/06/27 Python
python实现批量注册网站用户的示例
2019/02/22 Python
python语言线程标准库threading.local解读总结
2019/11/10 Python
解决Jupyter因卸载重装导致的问题修复
2020/04/10 Python
详解如何在pyqt中通过OpenCV实现对窗口的透视变换
2020/09/20 Python
Python return语句如何实现结果返回调用
2020/10/15 Python
Python用Jira库来操作Jira
2020/12/28 Python
CSS3——齿轮转动关键代码
2013/05/02 HTML / CSS
Html5与App的通讯方式详解
2019/10/24 HTML / CSS
大学四年职业生涯规划书范文
2014/01/02 职场文书