`
dream_people
  • 浏览: 60124 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

一个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()


分享到:
评论

相关推荐

    50行Python代码实现代理服务器

    这里的代理服务器,是指二级代理服务器。比如:A可以访问B,B可以访问C,A不能直接访问C。这时,如果在B开一个二级代理,就可实现A访问C。现有的工具有CCProxy。...这里就是使用Python简单的实现一个二级代理。

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

    本文实例讲述了python实现简单的TCP代理服务器的方法,分享给大家供大家参考。 具体实现代码如下: # -*- coding: utf-8 -*- ''' filename:rtcp.py @desc: 利用python的socket端口转发,用于远程维护 如果连接不到...

    Python-一个简单的代理可以将Websocket消息转发到Unix套接字反之亦然

    本文将深入探讨一个基于Python实现的简单代理,它能够将Websocket消息高效地转发到Unix套接字,同时也支持反向操作,即从Unix套接字接收消息并发送到Websocket客户端。这个工具名为"ws-unix-framed-bridge",它为...

    使用 Python 和 Flask 创建一个 HTTP 代理服务器

    使用 Python 和 Flask 创建一个 HTTP 代理服务器是一种高效且灵活的方式来处理 HTTP 请求和响应。Flask 是一个轻量级的 Web 框架,易于学习和使用,非常适合快速开发和原型设计。通过结合 Flask 和 Python 的标准库...

    Python-一个自己写的python3的简单到发指的爬虫

    在这个“Python-一个自己写的python3的简单到发指的爬虫”的项目中,我们将深入探讨Python3的基本爬虫实现,以及涉及到的相关知识点。 首先,我们要了解Python3爬虫的基础,这通常包括HTTP/HTTPS协议、网络请求库...

    一种基于Python Flask的Web服务器端设计.pdf

    Nginx是一款高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。在Web服务器端架构中,Nginx通常用作静态资源服务器和反向代理服务器,它能够快速响应静态文件的请求,而对于动态请求则转发至uWSGI...

    python超实用技能:使用Python开发SQLite代理服务器的方法

    标题中的“Python超实用技能:使用Python开发SQLite代理服务器的方法”指的是使用Python编程语言来创建一个SQLite数据库的代理服务,从而解决SQLite数据库无法远程访问的问题。这个代理服务器充当了一个中间层,使得...

    简单HTTP代理服务器

    源码编写一个简单的HTTP代理服务器,首先需要理解HTTP的基本请求结构,包括GET、POST等方法,以及请求头和请求体的构成。接着,你需要使用合适的编程语言,如Python、Java或C++,来实现这个代理服务。这可能涉及创建...

    Python-mailproxy是一个简单的SMTP代理

    mailproxy是一个简单的SMTP代理。 它通过未加密的未经身份验证的SMTP接口接收电子邮件,并通过需要现代功能(SSL,STARTTLS)和/或身份验证(SMTP AUTH))的远程SMTP服务器重新发送。 mailproxy主要用于在仅支持纯...

    简单的python服务器

    除了socket外没有用到任何第三方库,完全从最底层写起,对研究http协议有帮助。仅实现简单的代理功能

    Python-MailinaBox一键轻松部署邮件服务器

    这个项目将复杂的邮件服务器配置集成为一个简单的命令行工具,使得非专业技术人员也能轻松设置自己的邮件服务,从而实现完全的隐私和数据控制。 Mail-in-a-Box 包含了以下关键组件和服务: 1. **域名解析(DNS)**...

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

    于是就自己用python写一个。   原理很简单。 1.开一个socket server监听连接请求 2.每接受一个客户端的连接请求,就往要转发的地址建一条连接请求。即client->proxy->forward。proxy既是socket服务端(监听client),...

    Python简单实现的代理服务器端口映射功能示例

    本文实例讲述了Python简单实现的代理服务器端口映射功能。分享给大家供大家参考,具体如下: 一 代码 1、模拟服务端代码 import sys import socket import threading #回复消息,原样返回 def replyMessage(conn): ...

    proxy.py, 在 python 中,轻量级的HTTP代理服务器.zip

    proxy.py, 在 python 中,轻量级的HTTP代理服务器 proxy.pypython 中的轻量级HTTP代理服务器。特性作为单个文件模块分发除了 python 标准库之外没有依赖项支持 http,https,web sockets请求代理安装要简单安装 ...

    Python-一个简单的Python爬虫

    **Python-一个简单的Python爬虫** 在Python编程领域,Web爬虫是一种常用的技术,用于自动地从互联网上抓取信息。Python因其丰富的库支持和简洁的语法,成为了编写爬虫的首选语言。在这个主题中,我们将深入探讨如何...

    Python反向代理服务器.rar_Python_

    本压缩包文件“Python反向代理服务器.rar”显然是提供了一个简单的Python实现反向代理的示例。 首先,让我们理解什么是反向代理。反向代理是一种网络架构模式,它位于客户端和服务器之间,接收来自客户端的请求,并...

    Python-一个简单的web服务代理只有19行Python代码

    标题中的"Python-一个简单的web服务代理只有19行Python代码"揭示了我们将讨论的是一个用Python编写的小型Web服务代理。这个代理可能是用于转发HTTP请求,帮助隐藏客户端的真实身份,或者提供网络访问的透明性。它...

    Python-pythonstatsdstatsd服务器的Python客户端

    Python-statsd是一个Python实现的客户端库,用于与statsd服务器通信。Statsd是Twitter开发的一款轻量级代理服务,主要用于收集、聚合并转发应用的度量数据,如计数器、计时器、直方图和分布,这些数据通常被用作监控...

    通过代理服务器网站获取代理服务器IP

    1. **获取网站列表**:首先,你需要一个包含代理服务器网站的列表。这个列表可以从网上手动收集,或者从已有的数据文件(如压缩包中的`ProxyNet`文件)中读取。这些网站可能需要定期检查以确保其有效性。 2. **解析...

    基于 Python 轻松自建 App 服务器.pdf

    2. **基于 Tornado 的 HTTP 服务器框架**:Tornado 是一个开源的 Python Web 框架,它支持异步网络操作,非常适合构建高性能的应用程序服务器。 3. **App 客户端/服务器端之间的数据通信**:详细讲解如何实现客户端...

Global site tag (gtag.js) - Google Analytics