gpt4 book ai didi

python - Twisted 在连接关闭之前不发送任何内容

转载 作者:太空宇宙 更新时间:2023-11-03 19:14:21 25 4
gpt4 key购买 nike

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

最佳答案

在循环回调中输入 ctrl-c 会显示问题。您的协议(protocol)陷入“写入”模式,并且在离开回调之前永远无法到达 dataReceived 部分。

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

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

code for the single use client中的通知回调 gotProtocol 如何向 react 器添加另一条消息以供稍后调用,然后添加关闭回调。您需要进行递归回调设置。

这是您的代码,设置为根据需要递归链接附加回调。它还具有 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()

关于python - Twisted 在连接关闭之前不发送任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11861361/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com