连接到服务器后,在不阻塞主反应器的情况下等待用户输入并将其发送到服务器

After connecting to a server, wait for user input without blocking the main reactor and send it to the server

我在使用 Python 和 Twisted 时遇到了一些麻烦。我已经开始编写一个连接到服务器并向其发送消息的客户端(服务器目前只是回应)。这一切都很好,但我需要一种方法让我的程序 'wait' (我的意思是尽可能宽松地等待,我知道你等不及了,因为它是一个阻止主循环的阻塞动作reactor) 用于用户输入,并将输入的任何内容发送到服务器。 我已经查看了扭曲站点中的 stdiodemo and stdin 代码示例,但它们对我来说仍然没有多大意义。任何人都可以通过给我一个关于如何获取标准输入并将其发送到服务器的清晰示例来帮助我解决这个问题吗?

编辑:我当前的代码,已尝试实现 stdio

from twisted.internet import stdio
from twisted.protocols import basic
from twisted.internet.protocol import Protocol, Factory
from twisted.internet import reactor
from twisted.internet.protocol import ClientFactory
from twisted.protocols.basic import LineReceiver
from twisted.internet import stdio


class Echo(basic.LineReceiver):
   from os import linesep as delimiter

   def connectionMade(self):
      self.transport.write('>>> ')

   def lineReceived(self, line):
      self.sendLine('Echo: ' + line)
      self.transport.write('>>> ')

class EchoClientFactory(ClientFactory):
    protocol = Echo

    def clientConnectionLost(self, connector, reason): #reason why etc etc. Consider 'resume connection' on timer, to deal with willing/forced peers leaving
        print "[!] Connection lost "

    def clientConnectionFailed(self, connector, reason):
        print "[!] Connection failed "

    def connect_to(HOST, PORT):
        factory = EchoClientFactory()
        reactor.connectTCP(HOST, PORT, factory) #connect to $ on port

def main():
    stdio.StandardIO(Echo())
    host = "192.168.221.134"
    port = 8000
    reactor.callLater(0, connect_to, HOST=host, PORT=port)
    reactor.run()

if __name__ == '__main__':
    main()

我还应该补充一点,在服务器端,它发送“>>>”。此外,这是 Linux 系统上的全部 运行。

您基本上需要在 Reactor 中添加 stdin 作为事件源。这就是您链接的 stdin.py 示例所做的——正如它在评论中所说:

An example of reading a line at a time from standard input without blocking the reactor.

当您的 lineReceived() 回调被调用时,您只需将行发送到服务器即可。使用示例代码应该非常简单。