2

Python ツイスト インターネット フレームワークを学習しようとしていますが、1 つのことが混乱しています。telnet を使用した初期テストでは、protocol.Protocol.dataReceived()データを受信するたびにメソッドが呼び出されることが示されています。したがって、次のように定義すると、起動する前に EOL を待機します。

def dataReceived(self, data):
    print "MyProtocol::dataReceived, (%s)" %(data)

出力:

MyProtocol::dataReceived, (dgdfg
)

ただし、余分な行を追加するとすぐに:

def dataReceived(self, data):
    print "MyProtocol::dataReceived, (%s)" %(data)
    self.transport.write(data)

すべての文字に対して発火します。

出力:

MyProtocol::dataReceived, (d)
MyProtocol::dataReceived, (g)
MyProtocol::dataReceived, (d)
MyProtocol::dataReceived, (f)
MyProtocol::dataReceived, (g)
MyProtocol::dataReceived, (
)

ここで何が起こっているかについてのアイデアはありますか?

工場はprotocol.Factoryあり、プロトコルはprotocol.Protocol

ありがとう

4

2 に答える 2

3

行のバッファリングは起動前に行われないためdataReceived( docs )、受信したものが EOL で区切られているという保証はありません。ただし、送信するメッセージがデフォルトの読み取りチャンク サイズに収まるため、これが問題の原因である可能性は低いです。残りのコードを共有していただけませんか?

ラインバッファリングを処理するLineReceiverプロトコル ( docs ) を調べることができます。次に例を示します。

from twisted.internet import reactor
from twisted.protocols import basic

class EchoLine(basic.LineReceiver):
    delimiter = '\n'  # default is '\r\n'

    def lineReceived(self, line):
        print("received: %s" % line)
        self.sendLine(line)

class EchoFactory(protocol.ServerFactory):
    protocol = EchoLine

reactor.listenTCP(port, EchoFactory())
reactor.run()
于 2012-09-30T09:26:09.200 に答える
1

使用しているクライアントは、送信前に行バッファリングを行うことがあります。おそらく、バッファリング動作の違いを得るために 2 つのクライアントを切り替えたか、クライアントでバッファリング オプションを切り替えたでしょう。

于 2012-09-30T12:12:27.820 に答える