Python实现简单的代理服务器

本文实例讲述了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程序设计有所帮助。

(0)

相关推荐

  • python实现简单的TCP代理服务器

    本文实例讲述了python实现简单的TCP代理服务器的方法,分享给大家供大家参考. 具体实现代码如下: # -*- coding: utf-8 -*- ''' filename:rtcp.py @desc: 利用python的socket端口转发,用于远程维护 如果连接不到远程,会sleep 36s,最多尝试200(即两小时) @usage: ./rtcp.py stream1 stream2 stream为:l:port或c:host:port l:port表示监听指定的本地端口 c:host

  • 仅用50行Python代码实现一个简单的代理服务器

    之前遇到一个场景是这样的: 我在自己的电脑上需要用mongodb图形客户端,但是mongodb的服务器地址没有对外网开放,只能通过先登录主机A,然后再从A连接mongodb服务器B. 本来想通过ssh端口转发的,但是我没有从机器A连接ssh到B的权限.于是就自己用python写一个. 原理很简单. 1.开一个socket server监听连接请求 2.每接受一个客户端的连接请求,就往要转发的地址建一条连接请求.即client->proxy->forward.proxy既是socket服务端(监

  • python实现通过代理服务器访问远程url的方法

    本文实例讲述了python实现通过代理服务器访问远程url的方法.分享给大家供大家参考.具体如下: import urllib proxies = {'http' : 'http://proxy:80'} urlopener = urllib.FancyURLopener(proxies) htmlpage = urlopener.open('http://www.baidu.com') data = htmlpage.readlines() print data 希望本文所述对大家的Pytho

  • Python写的Socks5协议代理服务器

    直接上代码: #!/usr/bin/python # Filename s5.py # Python Dynamic Socks5 Proxy # Usage: python s5.py 1080 # Background Run: nohup python s5.py 1080 & import socket, sys, select, SocketServer, struct, time class ThreadingTCPServer(SocketServer.ThreadingMixIn

  • Python基于scrapy采集数据时使用代理服务器的方法

    本文实例讲述了Python基于scrapy采集数据时使用代理服务器的方法.分享给大家供大家参考.具体如下: # To authenticate the proxy, #you must set the Proxy-Authorization header. #You *cannot* use the form http://user:pass@proxy:port #in request.meta['proxy'] import base64 proxy_ip_port = "123.456.7

  • Python实现简单的代理服务器

    本文实例讲述了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 '

  • Python脚本简单实现打开默认浏览器登录人人和打开QQ的方法

    本文实例讲述了Python脚本简单实现打开默认浏览器登录人人和打开QQ的方法.分享给大家供大家参考,具体如下: 每天打开电脑第一件事应该就是打开人人刷一下,然后登上QQ.每次都这样很麻烦,于是写了一个脚本,每次双击即可自动完成这两个工作. 注意:需要在人人登录时选择"下次自动登录",QQ也要选择自动登录.其实感觉这些设置都是没必要的,都可以用脚本完成,但是本人比较水,就偷了懒,没有去查资料. 代码如下: todo.pyw: import webbrowser import os web

  • Python实现简单拆分PDF文件的方法

    本文实例讲述了Python实现简单拆分PDF文件的方法.分享给大家供大家参考.具体如下: 依赖pyPdf处理PDF文件 切分pdf文件 使用方法: 1)将要切分的文件放在input_dir目录下 2)在configure.txt文件中设置要切分的份数(如要切分4份,则设置part_num=4) 3)执行程序 4)切分后的文件保存在output_dir目录下 5)运行日志写在pp_log.txt中 P.S. 本程序可以批量切割多个pdf文件 from pyPdf import PdfFileWri

  • python实现简单的socket server实例

    本文实例讲述了python实现简单的socket server的方法.分享给大家供大家参考.具体如下: import socket host = '' port = 55555 myServerSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) myServerSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,1) myServerSocket.bind((host,

  • python实现简单socket通信的方法

    本文实例讲述了python实现简单socket通信的方法.分享给大家供大家参考,具体如下: 刚刚开始接触python,实现了一个helloworld程序---关于udp协议的socket通信demo. 首先服务端这边的实现如下: import socket, traceback host = '' # Bind to all interfaces port = 51500 # Step1: 创建socket对象 s = socket.socket(socket.AF_INET, socket.S

  • python超简单解决约瑟夫环问题

    本文实例讲述了python超简单解决约瑟夫环问题的方法.分享给大家供大家参考.具体分析如下: 约瑟环问题大家都熟悉.题目是这样的.一共有三十个人,从1-30依次编号.每次隔9个人就踢出去一个人.求踢出的前十五个人的号码: 明显的约瑟夫环问题,python实现代码如下: a = [ x for x in range(1,31) ] #生成编号 del_number = 8 #该删除的编号 for i in range(15): print a[del_number] del a[del_numbe

  • Python正则简单实例分析

    本文实例讲述了Python正则简单用法.分享给大家供大家参考,具体如下: 悄悄打入公司内部UED的一个Python爱好者小众群,前两天一位牛人发了条消息: 小的测试题: re.split('(\W+)', ' test, test, test.') 返回什么结果 一开始看,我倒没注意W是大写的,以为是小写的w代表单词字符(含下划线),今天运行一看才发现是大写的. 在IDLE跑一下的结果如下: >>> import re >>> re.split('(\W+)', ' t

  • 在Linux命令行终端中使用python的简单方法(推荐)

    Linux终端中的操作均是使用命令行来进行的.因此,对于小白来说,熟记几个基本的命令行和使用方法能够较快的在Linux命令行环境中将python用起来. 打开命令行窗口 打开命令行窗口的快捷键如下: Ctrl + Alt + t 关闭名命令行窗口 关闭命令行窗口的快捷键如下: Ctrl + d 进入python环境 在命令行中直接输入python即进入了python的编辑环境.进入环境后最明显的提示是:光标由-$变成>>>. 退出python环境 使用ctrl +d的方式退出python

  • python冒泡排序简单实现方法

    本文实例讲述了python冒泡排序简单实现方法.分享给大家供大家参考.具体实现方法如下: #!/usr/bin/python import random def bubble_sort(data): length = len(data) for i in range(len(data) - 1): for j in range(len(data) - 1): if (data[j] < data[j + 1]): tmp = data[j] data[j] = data[j + 1] data[

随机推荐