編集:テキストを介して追加していたため、ファイルが適切に保存されていなかったため、最初に望んでいた方法を書き直し、代わりにファイルをストリームとして保存することにしました:ツイストサーバー:
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 オブジェクトを最初に受け取ったときにのみ行いたいことです。
ありがとう!