1

問題は、接続を閉じるまで Twisted が何も送信しないように見えることです。この問題は、クライアントと Firefox の両方で見られます (サーバーが送信していません)。

これが完全なコードです。

#!/usr/bin/env python
#-*- coding: utf-8 -*-
from twisted.internet.protocol import Protocol,Factory
from twisted.internet.endpoints import TCP4ServerEndpoint,TCP4ClientEndpoint
from twisted.internet import reactor
import thread
class echoProtocol(Protocol):
    def dataReceived(self,data):
        self.transport.write(data+"\n - Server")

class echoFactory(Factory):
    def buildProtocol(self,addr):
        print addr.host
        return echoProtocol()

class clientProtocol(Protocol):
    def sendMessage(self,message):
        self.transport.write(message)
    def dataReceived(self,data):
        print data

class clientFactory(Factory):
    def buildProtocol(self,addr):
        return clientProtocol()

def messageLoop(p):
    while 1 :
        text=raw_input("")
        p.sendMessage(text)

def connectedProtocol(p):
    thread.start_new_thread(messageLoop, p)

if __name__ == '__main__':
    choice=raw_input("Server?[y/n]")
    if choice.lower()=="y":
        TCP4ServerEndpoint(reactor,44554).listen(echoFactory())
        reactor.run()
    else:
        TCP4ClientEndpoint(reactor,"127.0.0.1",44554).connect(clientFactory()).addCallback(connectedProtocol)
        reactor.run()

接続を閉じる前に Twisted に実際に何かを送信させるにはどうすればよいですか?

4

3 に答える 3

1

ctrl-cループするコールバックにパンチインすると、問題が示されます。dataReceivedプロトコルは「書き込み」モードでスタックしており、コールバックを離れるまでセクションに到達できません。

デフォルトのエコー クライアントの例に従えない理由はありますか? reactor.stopまた、どこにも電話していません。

主な問題は、据え置きの概念の誤解です。while ループ内でブロックします。つまり、dataReceived. しかし、ループしない場合、どうやってデータを送信し続けるのでしょうか? 現在の deferred 内に別の deferred を追加する必要があります。

使い捨てクライアントのコードでgotProtocol、コールバックが後で呼び出すために別のメッセージをリアクタに追加し、次に終了コールバックを追加する方法に注意してください。再帰コールバックのセットアップを行う必要があります。

必要に応じて追加のコールバックを再帰的にチェーンするように設定したコードを次に示します。また、errback チェーンのシャットダウン機能もあります。raw_inputのようなものが入力された場合は、その内容を確認してクロージング コールバックをアタッチするコードを追加する必要quitがあります。そうしないと、ユーザーが でヒットしない限り、永遠にループしますctrl-c

#!/usr/bin/env python
#-*- coding: utf-8 -*-
from twisted.internet.protocol import Protocol,Factory
from twisted.internet.endpoints import TCP4ServerEndpoint,TCP4ClientEndpoint
from twisted.internet import reactor
import thread

class echoProtocol(Protocol):
    def dataReceived(self,data):
        self.transport.write(data+"\n - Server")

class echoFactory(Factory):
    def buildProtocol(self,addr):
        print addr.host
        return echoProtocol()

class clientProtocol(Protocol):
    def sendMessage(self,message):
        self.transport.write(message)
    def dataReceived(self,data):
        print data

class clientFactory(Factory):
    def buildProtocol(self,addr):
        return clientProtocol()

def messageLoop(p):
    text=raw_input("")
    p.sendMessage(text)
    reactor.callLater(1, messageLoop, p)

def connectedProtocol(p):
    thread.start_new_thread(messageLoop, p)

def shutdown(ignored):
    reactor.stop()

if __name__ == '__main__':
    choice=raw_input("Server?[y/n]")
    if choice.lower()=="y":
        TCP4ServerEndpoint(reactor,44554).listen(echoFactory())
        reactor.run()
    else:
        TCP4ClientEndpoint(reactor,"127.0.0.1",44554).connect(clientFactory()).addCallback(messageLoop).addErrback(shutdown)
        reactor.run()
于 2012-08-08T14:22:15.710 に答える
0

あなたは行を読んでいるが、行を送っていないのではないかと思います。この状況では、読み取りは改行またはEOSを取得するまでブロックされます。EOLを送信しない場合は、ソケットを閉じるときに1本の大きな線が表示されます。

于 2012-08-08T10:33:12.070 に答える
0

とはconnectedProtocol? サンプルでは何も使用していませんが、実際のアプリケーションで厄介なスレッド関連のバグのイメージを呼び起こします。

それとは別に、writeSomeData呼び出すメソッドが間違っています。write代わりに試してください。

于 2012-08-08T13:15:17.027 に答える