`
qiezi
  • 浏览: 498828 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Twisted 编写的TCP转向连接程序

阅读更多
机房对外的系统安装的是Linux,内网有一台Windows机器,想找工作把3389端口转到Linux服务器上,每次临时启用。

安装了iptables,竟然提示缺少模块,配置也比较繁琐,所以就放弃了。

想到以前用过的twisted,于是自己写了一个小工具:

from twisted.internet.protocol import Protocol, ClientFactory, ServerFactory
from twisted.internet import reactor
import sys

class ForwardServer(Protocol):
    def __init__(self, host, port):
        self.host = host
        self.port = port
        self.data = ""
        self._connected = False

    def dataReceived(self, data):
        #print "Received %d bytes from client\n" % len(data)
        self.data += data
        #print "%d bytes in buffer" % len(self.data)
        if self._connected and (len(self.data) > 0):
            self.connector.transport.write(self.data)
            #print "Sent %d bytes to server" % len(self.data)
            self.data = ""

    def connectionMade(self):
        self.connector = reactor.connectTCP(self.host, self.port, ForwardClientFactory(self))
        print "Client connected"

    def setConnected(self, flag):
        if flag:
            self.onConnected()
        else:
            self.transport.loseConnection()
        self._connected = flag

    def onConnected(self):
        if len(self.data) > 0:
            self.connector.transport.write(self.data)
            self.data = ""

    def connectionLost(self, reason):
        self.connector.transport.loseConnection()
        self._connected = False
        print "Client disonnected"

class ForwardClient(Protocol):
    def __init__(self, forward):
        self.forward = forward

    def dataReceived(self, data):
        #print "Received %d bytes from server\n" % len(data)
        self.forward.transport.write(data)

    def connectionMade(self):
        print "Connected to server"
        self.forward.setConnected(True)

    def connectionLost(self, reason):
        self.forward.setConnected(False)
        print "Disconnected from server"

class ForwardServerFactory(ServerFactory):
    def __init__(self, host, port):
        self.host = host
        self.port = port

    def buildProtocol(self, addr):
        return ForwardServer(self.host, self.port)

class ForwardClientFactory(ClientFactory):
    def __init__(self, forward):
        self.forward = forward

    def buildProtocol(self, addr):
        return ForwardClient(self.forward)

    def clientConnectionFailed(self, connector, reason):
        self.forward.transport.loseConnection()


if __name__ == "__main__":
    if len(sys.argv) != 4:
        print "USAGE: %s <host> <port> <listen port>" % sys.argv[0]
        sys.exit(1)
    host, port, listen_port = sys.argv[1], int(sys.argv[2]), int(sys.argv[3])
    server_factory = ForwardServerFactory(host, port)
    reactor.listenTCP(listen_port, server_factory)
    reactor.run()

运行:
python port_forward.py 192.168.0.10 3389 3389

就可以在本机上监听3389端口,有客户连接时就建立起到服务器的连接,并在2台机器间转发数据。

twisted是reactor架构,可以支持多个侦听器和连接器,也可以接受多个客户同时访问。作些修改,就可以改成简单的负载均衡服务器。twisted易用性、效率都是很不错的。
分享到:
评论
1 楼 ggyy 2006-12-28  
就是twisted还没有发布for 2.5,看来我还要等段时间了.

相关推荐

    twisted编写TCP服务器

    Twisted 是一个强大的异步网络编程框架,特别适合用来编写灵活且高效的服务器应用程序。它的设计哲学在于通过分层的方式组织代码,使得服务器的构建模块化,易于管理和扩展。本文主要聚焦于使用Twisted来创建TCP、...

    BurstLink, 基于 Twisted的假多连接代理.zip

    BurstLink, 基于 Twisted的假多连接代理 BurstLink一种基于 Twisted的假多连接注释这是一个测试版,可能有 Bug当前不支持支持加密传输安装客户端 Windows安装 python 2.7安装 Twisted 和 zope从下载这里文件

    twisted系列教程-中文

    Twisted的异步模型可以让程序员轻松地编写高效的网络应用程序,例如Web服务器、聊天服务器、游戏服务器等。 Twisted的异步模型可以分为两个部分:Reactor和Protocol。Reactor是Twisted的核心组件,负责管理所有的I/...

    twisted例子

    2. **TCP服务**:可能会有一个简单的TCP服务器示例,展示如何使用Twisted来监听和处理客户端的TCP连接。这将涉及`twisted.internet.protocol`和`twisted.internet.endpoints`模块。 3. **UDP通信**:除了TCP,...

    twisted 从入门到精通

    ##### 2.2 使用 TCP 连接 - **第2章**:详细介绍如何使用 Twisted 创建 TCP 服务器和客户端。这一章将从最基础的概念入手,逐步引导读者实现一个完整的 TCP 应用。 ##### 2.3 Web 客户端与服务器 - **第3章**:...

    Twisted事件驱动网络框架

    **Twisted事件驱动网络框架详解** Twisted是一个强大的开源Python库,主要用于构建异步网络应用程序。...通过熟练掌握Twisted,你可以编写出高效率、低延迟的网络程序,满足现代互联网的高性能需求。

    Twisted Network Programming Essentials

    4. **TCP和UDP编程**:书中的例子会涵盖如何使用Twisted创建TCP服务器和客户端,以及如何处理无连接的UDP通信。这对于实现聊天应用、文件传输等网络服务非常有用。 5. **HTTP编程**:了解如何使用Twisted实现HTTP...

    twisted适合python3.8版本

    7. **测试框架**:Twisted还附带了一个强大的测试框架—— Trial,它支持异步测试,帮助开发者编写和执行对异步代码的单元测试。 8. **安全性**:Twisted包含了一些安全相关的组件,如加密套接字和认证机制,使得...

    twisted网络编程.txt

    1. **编写TCP服务器和客户端**: - 使用 `twisted.internet.protocol.ServerFactory` 创建服务器工厂。 - 使用 `twisted.internet.protocol.ClientFactory` 创建客户端工厂。 - 通过 `reactor.listenTCP` 绑定...

    使用Python的Twisted框架编写非阻塞程序的代码示例

    # ~*~ Twisted - A Python tale ~*~ from time import sleep # Hello, I'm a developer and I mainly setup WordPress. def install_wordpress(customer): # Our hosting company Threads Ltd. is bad. I start ...

    twisted入门教程源码

    - **twisted.internet**: 提供了各种网络接口,包括TCP、UDP、SSL/TLS、UNIX域套接字等。还有线程池、延迟调用、计时器等功能。 - **twisted.web**: 用于构建Web服务器和客户端,支持HTTP、HTTPS以及WebSockets。 ...

    socket编程之tcp连接代码

    在本主题中,我们将深入探讨TCP(传输控制协议)连接的Socket编程,包括服务器端和客户端的实现代码。 TCP是一种面向连接的、可靠的传输层协议,它确保了数据在发送到目的地之前是完整且有序的。TCP连接的建立过程...

    twisted网络通信模型

    一个简单的 Twisted 应用程序通常会创建一个工厂,定义协议类,然后使用反应器的 `connectXXX` 或 `listenXXX` 方法启动监听或连接,并调用 `reactor.run()` 启动事件循环。例如: ```python from twisted.internet...

    twisted 语法 pdf

    Twisted是一个用Python编写的事件驱动网络引擎,它提供了构建服务器和客户端应用程序的强大工具。以下是对文档中提到的重要知识点进行的详细解读: ### 一、Twisted框架概述 #### 1.1 Twisted的愿景 Twisted的目标...

    Twisted-15.4.0

    **Python** 是 Twisted 构建的基础,因为 Twisted 是用 Python 编写的,所以使用它意味着你可以利用 Python 的强大语法和丰富的生态系统。Python 的动态性和面向对象特性使得编写复杂的网络程序变得简单且灵活。...

    python twisted系列

    下面将详细讨论Twisted的核心概念、主要功能以及如何使用它来构建异步应用程序。 一、Twisted框架核心概念 1. **事件驱动编程**:Twisted基于事件驱动模型,通过回调函数处理网络事件,如连接建立、数据接收、连接...

Global site tag (gtag.js) - Google Analytics