Основное различие между twisted.protocols.telnet
и twisted.conch.telnet
состоит в том, что первый реализует часть протокола Telnet (RFC 854) и добавляет некоторую «удобную» функциональность, которая применяется для стандартных сеансов в виде имени пользователя / пароля, тогда как последний реализует весь протокол Telnet и оставляет удобство для разработчика приложений.
К счастью, эту «удобную» функциональность не сложно реализовать самостоятельно. В основном это две вещи: разбор строк у клиента и вызов другого метода в зависимости от того, на какой стадии (или «состоянии») находится соединение. LineReceiver
выполнит первое, а второе простое. Так, например:
from twisted.protocols.basic import LineReceiver
from twisted.conch.telnet import TelnetProtocol
class SimpleTelnetSession(LineReceiver, TelnetProtocol):
def connectionMade(self):
self.transport.write('Username: ')
self.state = 'USERNAME'
def lineReceived(self, line):
getattr(self, 'telnet_' + self.state)(line)
def telnet_USERNAME(self, line):
self.username = line
self.transport.write('Password: ')
self.state = 'PASSWORD'
...
Это более или менее то, что AuthenticatingTelnetProtocol
также реализует.