在连接关闭之前扭曲不发送任何内容

时间:2012-08-08 09:17:49

标签: python networking twisted

问题是,在关闭连接之前,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实际发送内容?

3 个答案:

答案 0 :(得分:1)

在循环回调中对ctrl-c进行打孔显示问题。您的协议处于“写入”模式,并且在它离开回调之前永远不能进入dataReceived部分。

有什么理由不能遵循默认echo client example吗?您也没有在任何地方调用reactor.stop

主要问题是对延迟概念的误解。你在while循环中阻塞,这意味着你永远不会到达dataReceived。但是如果你不循环,你如何继续发送数据?您需要在当前延期中添加另一个延迟

请注意code for the single use client回调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()

答案 1 :(得分:0)

我怀疑你是在读线而不是发送线路。在这种情况下,读取将阻塞,直到它获得换行符或EOS。如果你从未发送EOL,那么当你关闭套接字时,你会得到一个大线。

答案 2 :(得分:0)

什么是connectedProtocol?您的示例中没有任何内容使用它,但它位于那里,在您的实际应用程序中唤起令人讨厌的与线程相关的错误的图像。

除此之外,writeSomeData是一种错误的调用方法。请改为write