Python实现简单的代理服务器

作者:Sephiroth 时间:2023-03-28 15:13:50 

本文实例讲述了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,代理服务器
0
投稿

猜你喜欢

  • SQL Server 2016 配置 SA 登录教程

    2024-01-13 10:17:53
  • Linux自动备份MySQL数据库脚本代码

    2024-01-24 05:00:12
  • python实现批量命名照片

    2021-11-03 18:07:42
  • Python自定义一个类实现字典dict功能的方法

    2023-07-20 22:45:59
  • Pandas数据结构详细说明及如何创建Series,DataFrame对象方法

    2021-03-14 12:13:35
  • 阿里云ECS服务器部署django的方法

    2023-04-09 10:00:26
  • sqlserver2005使用row_number() over分页的实现方法

    2024-01-18 20:01:02
  • Python常用数据类型之间的转换总结

    2023-06-21 10:06:21
  • 中文字体在 CSS 中的写法

    2009-11-24 13:21:00
  • 在ASP.NET 2.0中操作数据之三十一:使用DataList来一行显示多条记录

    2024-05-11 09:30:00
  • 基于python,Matplotlib绘制函数的等高线与三维图像

    2021-09-06 08:51:33
  • asp源码实现Access数据库的建立或压缩

    2007-08-06 16:54:00
  • Python 找出出现次数超过数组长度一半的元素实例

    2023-06-07 05:50:33
  • Python并发编程实例教程之线程的玩法

    2022-02-02 08:17:41
  • Pycharm远程连接服务器并运行与调试

    2021-05-29 04:38:51
  • mysql8.0.12如何重置root密码

    2024-01-19 03:43:03
  • python+pytest接口自动化之token关联登录的实现

    2023-01-21 13:27:37
  • Vue组件之自定义事件的功能图解

    2024-05-05 09:07:34
  • Python入门教程(三十九)Python的NumPy安装与入门

    2023-08-25 10:38:30
  • 详解python pandas 分组统计的方法

    2021-01-30 05:33:48
  • asp之家 网络编程 m.aspxhome.com