6

「transport.write()」で文字列オブジェクトを転送できることは知っていますが、pythonクラスオブジェクトのような他のタイプのデータを転送できるか知りたいですか? 可能な場合、どうすればこれを行うことができますか?

4

3 に答える 3

2

jsonを使用してオブジェクトをシリアル化できます。ほとんどすべての Python オブジェクトは json シリアライズ可能であり、そうでない場合は、それらを処理する独自のエンコーダー/デコーダーを作成できます。ただし、入力をデコードするためにevalを使用しないでください。

于 2014-01-04T12:44:25.837 に答える
-2

トランスポート層の役割は、データを物理接続に書き込むことです。これは抽象化のレベルが低く、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

于 2014-01-04T13:26:29.287 に答える