2

編集:テキストを介して追加していたため、ファイルが適切に保存されていなかったため、最初に望んでいた方法を書き直し、代わりにファイルをストリームとして保存することにしました:ツイストサーバー:

from twisted.internet import reactor, protocol
import os,json

class Echo(protocol.Protocol):
    f = file
    def dataReceived(self, data):
        try:
            try:
                print format(json.loads(data))
                print "got jason"
                self.f=open("test.png","wb")

                self.transport.write("ready")
            except:
                print "filedata incoming!"
                self.f.write(data)
        except:
            print "unknown error" #happens if we don't receive json first

    def connectionLost(self, reason):
        if self.f!=file:self.f.close()

def main():
    """This runs the protocol on port 8000"""
    factory = protocol.ServerFactory()
    factory.protocol = Echo
    reactor.listenTCP(8000,factory)
    reactor.run()

# this only runs if the module was *not* imported
if __name__ == '__main__':
    main()

以下元記事

Twisted はファイルの 99.9% のように送信しますが、それで終わりのようです。ファイルを間違って書いているのではないかと考えています。

ねじれたサーバー:

from twisted.internet import reactor, protocol
import os,json

class Echo(protocol.Protocol):

    def dataReceived(self, data):
        try:
            print format(json.loads(data))
            print "got jason"
            self.transport.write("ready")
        except:
            print "filedata incoming!"
            f = open("test.png","a")
            f.write(data)
            f.close()


def main():
    """This runs the protocol on port 8000"""
    factory = protocol.ServerFactory()
    factory.protocol = Echo
    reactor.listenTCP(8000,factory)
    reactor.run()

# this only runs if the module was *not* imported
if __name__ == '__main__':
    main()

ねじれたクライアント:

from twisted.internet import reactor, protocol
import os,json

fname="pic.png"

class EchoClient(protocol.Protocol):
    """Once connected, send a message, then print the result."""

    def connectionMade(self):

        fsize = os.path.getsize(fname) 
        self.transport.write(json.dumps({"file":{"size":fsize}}))

    def sendFile(self):
        print "sending file" 
        f = open(fname,"rb")
        self.transport.write(f.read())
        f.close()
        print "closing conn"
        self.transport.loseConnection()

    def dataReceived(self, data):
        "As soon as any data is receive"
        print "Server said: ", data
        self.sendFile()


    def connectionLost(self, reason):
        print "connection lost"

class EchoFactory(protocol.ClientFactory):
    protocol = EchoClient

    def clientConnectionFailed(self, connector, reason):
        print "Connection failed - goodbye!"
        reactor.stop()

    def clientConnectionLost(self, connector, reason):
        print "Connection lost - goodbye!"
        reactor.stop()


# this connects the protocol to a server runing on port 8000
def main():
    f = EchoFactory()
    reactor.connectTCP("localhost", 8000, f)
    reactor.run()

# this only runs if the module was *not* imported
if __name__ == '__main__':
    main()

基本的に、サーバーは実行されてリッスンしており、クライアントは接続してすぐにjsonを送信し、サーバーはパケットを受信して​​送信クライアントに「OK」を伝え、クライアントはファイルを送信します。次に、サーバーはファイルを受け取り、それをディスクに書き込みます。私はただテストしているだけなので、このプログラム、特にファイルの追加の使用はあまり意味がないかもしれませんが、転送と最終的な書き込みの後、ファイルは元のサイズとほぼ同じサイズであることに気付きましたが、まったく同じではありません。約 300 バイト小さいため、ほとんど役に立ちません。ファイルを間違って送信していますか? それとも単に書き方が悪いだけ?そうそう、サーバーとクライアントを同じコンピューターでテストしています。

最終的には、バックアップ目的で 2 台のローカル コンピュータとの間で 1 GB ものファイルを送受信する予定で、ファイルをデータ ストリームとして書き込みたいと考えています。使用している追加方法は好きではありませんが、よくわかりません。最初に実際にファイルを開かずにファイル オブジェクトを参照する方法。これは、json オブジェクトを最初に受け取ったときにのみ行いたいことです。

ありがとう!

4

2 に答える 2

1

テキストを追加するために「test.png」を開いています。それは意図的なものですか?

また、すべての例外exceptをキャッチするため、これは悪い考えです。予想される例外のみをキャッチします。

于 2012-06-29T19:40:01.363 に答える
0

問題は、すべてのデータが一度に受信されることを期待していることですdataReceived。これはインターネットのしくみではありません。この Twisted FAQ を参照して、なぜそうなのか、コードを修正する方法を説明してください

于 2012-06-29T21:47:19.820 に答える