Я пытаюсь написать клиент для простого TCP-сервера с использованием Python Twisted. Конечно, я новичок в Python и только начал смотреть на Twisted, так что мог все делать неправильно.
Сервер прост, и вы должны использовать nc или telnet. Нет аутентификации. Вы просто подключаетесь и получаете простую консоль. Я хотел бы написать клиент, который добавляет некоторые функции чтения (история и emacs, такие как ctrl-a / ctrl-e, - это то, что мне нужно)
Ниже приведен код, который я написал, который работает так же хорошо, как использование netcat из командной строки, как это nc localhost 4118
from twisted.internet import reactor, protocol, stdio
from twisted.protocols import basic
from sys import stdout
host='localhost'
port=4118
console_delimiter='\n'
class MyConsoleClient(protocol.Protocol):
def dataReceived(self, data):
stdout.write(data)
stdout.flush()
def sendData(self,data):
self.transport.write(data+console_delimiter)
class MyConsoleClientFactory(protocol.ClientFactory):
def startedConnecting(self,connector):
print 'Starting connection to console.'
def buildProtocol(self, addr):
print 'Connected to console!'
self.client = MyConsoleClient()
self.client.name = 'console'
return self.client
def clientConnectionFailed(self, connector, reason):
print 'Connection failed with reason:', reason
class Console(basic.LineReceiver):
factory = None
delimiter = console_delimiter
def __init__(self,factory):
self.factory = factory
def lineReceived(self,line):
if line == 'quit':
self.quit()
else:
self.factory.client.sendData(line)
def quit(self):
reactor.stop()
def main():
factory = MyConsoleClientFactory()
stdio.StandardIO(Console(factory))
reactor.connectTCP(host,port,factory)
reactor.run()
if __name__ == '__main__':
main()
Выход:
$ python ./console-console-client.py
Starting connection to console.
Connected to console!
console> version
d305dfcd8fc23dc6674a1d18567a3b4e8383d70e
console> number-events
338
console> quit
Я смотрел на
Витая интеграция Python с модулем Cmd
Это действительно не сработало для меня. Код примера отлично работает, но когда я представил сеть, у меня возникли условия гонки с stdio. Эта старая ссылка, кажется, поддерживает аналогичный подход (запуск строки чтения в отдельном потоке), но я не продвинулся далеко с этим.
Я также изучал оскорбления в виде витой раковины, но мне не удалось заставить что-либо работать, кроме демонстрационных примеров.
Как лучше всего создать клиент на базе терминала, который бы обеспечивал поддержку чтения в строке?
http://twistedmatrix.com/documents/current/api/twisted.conch.stdio.html
выглядит многообещающе, но я не понимаю, как его использовать.
http://twistedmatrix.com/documents/current/api/twisted.conch.recvline.HistoricRecvLine.html
также, похоже, обеспечивает поддержку обработки стрелок вверх и вниз, например, но я не мог заставить консоль переключаться на наследование от HistoricRecVLine вместо LineReceiver для работы.
Может быть, twisted - неправильный фреймворк, или я должен использовать все классы conch. Мне просто понравился его стиль, ориентированный на события. Есть ли лучший / простой подход к поддержке readline или readline в скрученном клиенте?