単純なツイスト サーバー実装で長いデータ (>1024 バイト) を受信する際に問題があります。最初から、ねじれたサーバーと同期する必要がある ios アプリを開発しています。送信する情報を JSON 形式で準備します。次に、そのデータをチャンクで送信し始めます (現在256bytes + 4 bytes
、コマンドのチャンクで - はい、独自のプロトコルを実装しています)。接続は問題なく、サーバーでこれらのパケットを受信します (dataReceived
自分の Protocol サブクラスの機能で)。ios メソッド:NSInteger writtenBytes =[self.outputStream write:[data bytes] maxLength:[data length]]
書き込まれたバイトをストリームに返します。最初の 4 パケットの場合、返される値は期待値 (260 バイト) です。送信できるバイト数がさらにある場合は、次にそのメソッドを呼び出したときに 0 が返されます (Apple のドキュメントによると: "If the receiver is a fixed-length stream and has reached its capacity, 0 is returned."
)。
したがって、入力バッファがいっぱいであると推測します。そのバッファを解放する方法がわかりません (そのバッファに到達する方法がわかりません)。そのバッファの限界がどこにあるのかわかりません (ほとんどばかげているように思えます)。
これはサーバーの基本的なテストです (文字列プロトコルに基づく基本的なこの質問にとって重要なことだけです)
from twisted.internet.protocol import Protocol, Factory
from twisted.internet import reactor
class IphoneSync(Protocol):
def __init__(self):
self.__buffer = ""
def connectionMade(self):
self.transport.write("0:")
self.factory.clients.append(self)
print "clients are ", self.factory.clients
def connectionLost(self, reason):
self.factory.clients.remove(self)
def dataReceived(self, data):
#print "data is ", data
a = data.split(':')
if len(a) > 1:
command = a[0]
content = a[1]
msg = ""
if command == "iam":
#user&Pass checking
msg = "1"
elif command == "msg":
self.__buffer += data
msg = "1: continue"
elif command == "fin":
#procesaremos todo
#Convertir datos en json
#insertar/actualizar data en sqlite
#devolver respuesta
print "buffer is", self.__buffer
msg = "2: procesing"
print msg
self.transport.write(msg)
#for c in self.factory.clients:
#c.message(msg)
def message(self, message):
self.transport.write(message)
#self.transport.write(message + '\n')
factory = Factory()
factory.protocol = IphoneSync
factory.clients = []
dir(factory)
reactor.listenTCP(8000, factory)
print "Iphone Chat server started"
reactor.run()
授業は見ましたLineReceiver
が、ラインを送っていません。転送されるデータは非常に大きくなる可能性があります (10Mb ~ 50Mb)。コンシューマー/プロデューサー モデル、または (AMP または PB) のような RPC プロトコルをソリューションとして考えていますが、独自のプロトコルで作業したいと考えていました。誰かが私を助ける方法を知っていれば、とても感謝しています。とにかくありがとう。