После подключения к серверу дождитесь ввода пользователя, не блокируя основной реактор, и отправьте его на сервер
У меня проблемы с Python и Twisted. Я начал писать клиент, который подключается к серверу и отправляет ему сообщения (которые сервер на данный момент просто возвращает обратно). Это все хорошо, но мне нужен способ, чтобы моя программа "ждала" (я имею в виду ожидание как можно более свободного термина, я знаю, что вы не можете ждать, потому что это блокирующее действие, которое блокирует основной цикл реактора) для пользовательского ввода и отправки того, что было введено на сервер. Я взглянул на примеры кода stdiodemo и 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.
1 ответ
В основном вам нужно добавить stdin в качестве источника событий в вашем Reactor. Вот что stdin.py
пример, на который вы ссылаетесь, - как сказано в его комментариях:
Пример чтения строки за раз со стандартного ввода без блокировки реактора.
Когда ваш lineReceived()
обратный вызов вызывается, вы просто можете отправить линию на сервер. Это должно быть довольно просто, используя пример кода.