这是到目前为止我想出的一些代码...

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

   class serverprotocol(Protocol):

       def dataReceived(self,data):
            print "[+] got \n" + data
            factory = protocol.ClientFactory()
            factory.protocol = Clientp
            global xx
            xx=data
            print xx
            reactor.connectTCP("127.0.0.1",80,factory)

   class Clientp(Protocol):
       def connectionMade(self):
            print "sending " + xx
            self.transport.write(xx)

       def dataReceived(self,data):
            print "+ got reply" + data

   factory = protocol.ServerFactory()
   factory.protocol = serverprotocol
   reactor.listenTCP(3333, factory)
   reactor.run()


我想知道如何将在客户端类中收到的数据发送回客户端
在端口3333上连接。

如果有更好的编码方法,请告诉我。

最佳答案

这是一个扭曲的常见问题解答:"How do I make input on one connection result in output on another"?

但这并不是一个扭曲的问题。它更多是一个基本的Python编程问题。

您要问的是,给定类Clientp,如何将参数传递给它,以便它知道以后要做什么?

答案很简单,就是“给它__init__并传递一个参数”

from twisted.internet.protocol import Protocol, Factory
from twisted.internet.endpoints import TCP4ClientEndpoint
from twisted.internet import reactor

class serverprotocol(Protocol):

    def dataReceived(self,data):
        print "[+] got \n" + data
        def clientProtocol():
            return Clientp(data)
        endpoint = TCP4ClientEndpoint(reactor, "127.0.0.1", 80)
        endpoint.connect(Factory.forProtocol(clientProtocol))

class Clientp(Protocol):
    def __init__(self, dataToSend):
        self.dataToSend = dataToSend

    def connectionMade(self):
        self.transport.write(self.dataToSend)

    def dataReceived(self,data):
        print "+ got reply" + data

reactor.listenTCP(3333,
                  Factory.forProtocol(serverprotocol))
reactor.run()


如果您想要的是完整的端口转发器,则可以使用twistd portforward或查看twisted.protocols.portforward中的代码。

10-06 02:39