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中dir函数用法分析
Apr 17 Python
在Python中使用matplotlib模块绘制数据图的示例
May 04 Python
在Django框架中编写Context处理器的方法
Jul 20 Python
使用Python的Django框架结合jQuery实现AJAX购物车页面
Apr 11 Python
Python 提取dict转换为xml/json/table并输出的实现代码
Aug 28 Python
Django rest framework工具包简单用法示例
Jul 20 Python
Python模拟自动存取款机的查询、存取款、修改密码等操作
Sep 02 Python
对Python3.x版本print函数左右对齐详解
Dec 22 Python
Python学习笔记之读取文件、OS模块、异常处理、with as语法示例
Jun 04 Python
python中删除某个元素的方法解析
Nov 05 Python
在python tkinter界面中添加按钮的实例
Mar 04 Python
Python实现FTP文件定时自动下载的步骤
Dec 19 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
ThinkPHP权限认证Auth实例详解
2014/07/22 PHP
php实现编辑和保存文件的方法
2015/07/20 PHP
如何在标题栏显示框架内页面的标题
2007/02/03 Javascript
Jquery + Ajax调用webService实例代码(asp.net)
2010/08/27 Javascript
基于jQuery的让非HTML5浏览器支持placeholder属性的代码
2011/05/24 Javascript
Javascript的常规数组和关联数组对比小结
2012/05/24 Javascript
javascript学习笔记(十三) js闭包介绍(转)
2012/06/20 Javascript
jQuery获取Select选择的Text和Value(详细汇总)
2013/01/25 Javascript
node.js中的http.response.end方法使用说明
2014/12/14 Javascript
jQuery中replaceWith()方法用法实例
2014/12/25 Javascript
js数组常用操作方法小结(增加,删除,合并,分割等)
2016/08/02 Javascript
js模糊查询实例分享
2016/12/26 Javascript
angularjs实现的前端分页控件示例
2017/02/10 Javascript
fckeditor部署到weblogic出现xml无法读取及样式不能显示问题的解决方法
2017/03/24 Javascript
基于JavaScript实现类名的添加与移除
2017/04/23 Javascript
JS去掉字符串末尾的标点符号及删除最后一个字符的方法
2017/10/24 Javascript
基于vue cli 通过命令行传参实现多环境配置
2018/07/12 Javascript
微信小程序实现弹框效果
2020/05/26 Javascript
Python求两个list的差集、交集与并集的方法
2014/11/01 Python
Python实现获取某天是某个月中的第几周
2015/02/11 Python
python引用DLL文件的方法
2015/05/11 Python
python下载图片实现方法(超简单)
2017/07/21 Python
在python中,使用scatter绘制散点图的实例
2019/07/03 Python
Python爬虫爬取Bilibili弹幕过程解析
2019/10/10 Python
python 变量初始化空列表的例子
2019/11/28 Python
Python scrapy增量爬取实例及实现过程解析
2019/12/24 Python
html5的localstorage详解
2017/05/09 HTML / CSS
html5使用canvas画一条线
2014/12/15 HTML / CSS
html5关于外链嵌入页面通信问题(postMessage解决跨域通信)
2020/07/20 HTML / CSS
世界上最具创新性的增强型知名运动品牌:Proviz
2018/04/03 全球购物
都柏林通行卡/城市通票:The Dublin Pass
2020/02/16 全球购物
深入开展党的群众路线教育实践活动方案
2014/02/04 职场文书
效能监察建议书
2014/05/19 职场文书
公证委托书标准格式
2014/09/11 职场文书
2015暑期社会实践个人总结
2015/07/13 职场文书
Python+Matplotlib图像上指定坐标的位置添加文本标签与注释
2022/04/11 Python