必要なのは、一種の中間者攻撃です。クライアント(さまざまな長さのバイナリデータ)から接続を受信し、接続先のサーバー(クライアントとして機能)にストリームを転送するサーバーが必要です。次に、接続されているサーバーからクライアントにデータを送り返します。
実際には、クライアントとサーバーの間に立って、それらが交換するデータを渡します(これはストリームであるため、一方の側から継続的に取得し、もう一方の側に送信します)。
サーバーは静的であるため、常に同じであり、そのアドレスをハードコーディングすることもできます。ただし、クライアントが接続を切断すると、このサーバーは「実際の」サーバーへの接続も切断する必要があります。
私は周りを見回してきましたが、そのような単純な問題の解決策や例を見つけることができませんでした。
私が作成したコードは実際に機能しますが、「これは割り当てられたクライアントです」というサーバー部分、または「これはあなたのサーバーです」というクライアントへの参照を配置する方法をまだ見つけることができません。これが私のコードです:
#!/usr/bin/env python
from twisted.internet import protocol, reactor
from twisted.protocols import basic
client = None
server = None
class ServerProtocol(protocol.Protocol):
def connectionMade(self):
global server
factory = protocol.ClientFactory()
factory.protocol = ClientProtocol
server = self
reactor.connectTCP('localhost', 1324, factory)
def dataReceived(self, data):
global client
client.transport.write(data)
class ClientProtocol(protocol.Protocol):
def connectionMade(self):
global client
# Here's the instance of the client
client = self
def dataReceived(self, data):
global server
server.transport.write(data)
def main():
import sys
from twisted.python import log
log.startLogging(sys.stdout)
factory = protocol.ServerFactory()
factory.protocol = ServerProtocol
# Here's the instance of the server
server = ServerProtocol
reactor.listenTCP(2593, factory)
reactor.run()
if __name__ == '__main__':
main()
ここで重要なのは、インスタンスをグローバルオブジェクトに含めることはできず、2つのクラス内に配置する必要があるということです。