「transport.write()」で文字列オブジェクトを転送できることは知っていますが、pythonクラスオブジェクトのような他のタイプのデータを転送できるか知りたいですか? 可能な場合、どうすればこれを行うことができますか?
3 に答える
jsonを使用してオブジェクトをシリアル化できます。ほとんどすべての Python オブジェクトは json シリアライズ可能であり、そうでない場合は、それらを処理する独自のエンコーダー/デコーダーを作成できます。ただし、入力をデコードするためにevalを使用しないでください。
トランスポート層の役割は、データを物理接続に書き込むことです。これは抽象化のレベルが低く、Python クラス オブジェクトのバイトへのマッピングは、プロトコル スタックの上位でより適切に処理されます。
したがって、これを処理する1つの方法は、Pythonオブジェクトを受け入れ、それをバイト表現に変換してからトランスポートにプッシュするカスタムプロトコルを作成することです.それを実行して、カスタムプロトコルを定義します
import pickle
from twisted.internet.protocol import Protocol, ClientFactory
from twisted.internet import reactor
from twisted.internet.endpoints import TCP4ClientEndpoint
class ClassSender(Protocol):
def dataReceived(self, data):
print pickle.loads(data)
def writeObject(self, _object):
pickle.dump(_object,self.transport)
class ClassSenderFactory(ClientFactory):
def buildProtocol(self, addr):
return ClassSender()
class MyClass(object):
def __init__(self,data):
self.data = data
def SendObject(protocol):
print "Sending"
protocol.writeObject(MyClass('some sample data'))
point = TCP4ClientEndpoint(reactor, "localhost", 8000)
d = point.connect(ClassSenderFactory())
d.addCallback(SendObject)
reactor.run()
このサンプル コードは、TCP でポート 8000 (localhost) への接続を試みます。接続が確立されたら、サンプル オブジェクトを取得してピクルし、トランスポートにプッシュします。
逆に、データが受信されると、それを unpickle してコンソールに出力しようとします。
これを実際に確認するには、エコー サーバー ( http://twistedmatrix.com/documents/current/core/examples/echoserv.py ) を実行し、サンプル コードを実行して、サンプル オブジェクトがエコー サーバーから跳ね返されることを確認します。
これに関する問題は、考慮する必要がある多くのまれなケースがあることです。データが 2 つのブロックに分割され、1 回の呼び出しで unpickle できない場合はどうすればよいでしょうか? 幸い、Twisted はパースペクティブ ブローカーと呼ばれるこの処理に対応する既製のクラスを提供します。ワイヤの両端を制御できる場合、これらの問題の多くに対処できます。見てみましょう: https://twistedmatrix.com/documents/12.2.0/core/howto/pb-intro.html