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,您将在关闭套接字时收到一条大线。

于 2012-08-08T10:33:12.070 回答
0

是什么connectedProtocol?您的示例中没有使用它,但它会在您的实际应用程序中唤起令人讨厌的线程相关错误的图像。

除此之外,writeSomeData是错误的调用方法。试试write吧。

于 2012-08-08T13:15:17.027 回答